Сохранение массива или IList в другой модели данных IList

#c# #mvvm #xamarin.forms

#c# #mvvm #xamarin.forms

Вопрос:

Кажется, я не могу найти наилучшую практику или наилучший механизм структурирования и использования данных для моего приложения MVVM Xamarin form. Это может быть простым недопониманием того, как решить проблему, но я не уверен.

Я пытался использовать IEnumerable, IList и простой массив для многомерных данных (привязка?) но я довольно новичок в MVVM, поэтому, возможно, я неправильно подхожу к этому.

Это для Xamarin.Формирует приложение для Android, поэтому использование привязок данных типа MySQL не работает (поскольку вы не можете хранить в базе данных). Таким образом, использование этих классов данных является правильным способом, но я не знаю, как структурировать реляционные данные. На каждой ленте может быть МНОГО видеороликов, кнопок и другого содержимого.

Я просмотрел примеры Xamarin по этому вопросу, но ни один из них не адресует реляционные данные, поставляемые с приложением.

 // Trying to use an aray
public IList<BeltContent> BeltContents { get; private set; }
public BeltData()
    {
        // Bringing it all together
        BeltContents = new List<BeltContent>();

        BeltContents.Add(new BeltContent
        {
            BeltName = "White",
            VideoContent = {
                  "https://url-to-my-video01", 
                  "https://url-to-my-video01" }
        });

    }


//Trying to use an IList to initialize inside

public IList<BeltContent> BeltContents { get; private set; }
public Ilist<VideoContent> VideoContents {get; private set; }
public BeltData()
    {
        // Bringing it all together
        BeltContents = new List<BeltContent>();
        VideoContents = new List<VideoContent>();

        BeltContents.Add(new BeltContent
        {
            BeltName = "White",
            VideoContent = VideoContents.Add(new VideoContent
               {
                   VideoName = "SomeName",
                   VideoUri = "Https://some-url-to-video"
               },
               {
                  //etc
               }
        });

    }
  

У меня также есть модели данных для этих
ПРИМЕЧАНИЕ: комментарии к BeltContent для других маршрутов, которые я пробовал.
Добавлено в качестве комментариев для консолидации кода

 // The Data Model for videos (note they all follow this pattern)
public class VideoContent
{
    public string VideoName { get; set; }

    public string VideoUri { get; set; }
}


// Full content for the data model
public class BeltContent
{

    public string BeltName { get; set; }

    public string BeltDescription { get; set; }

    // public IEnumerable<VideoContent> VideoContent {get; set;}
    // public string[] VideoContent {get; set; }
    // public IList<VideoContent> VideoContent {get; set;} 

    public VideoContent VideoContent {get; set; }

    public ButtonResourceUri ButtonResourceUri { get; set; }

    public WrittenContent WrittenContent { get; set; }

}
  

Я надеялся, что смогу использовать многомерный массив sort или IList для хранения вложенных данных.

Комментарии:

1. Я думаю, что ваш основной вопрос: «Как мне спроектировать свою модель данных?» Это довольно широкий вопрос, на который сложно ответить на SO. Есть ли какая-то конкретная часть дизайна, которая вызывает у вас проблемы? Тот факт, что это приложение Xamarin или MVVM, на самом деле не имеет отношения к дизайну вашей модели.

2. Я могу попытаться уточнить в приведенном выше вопросе, но я не уверен, как это описать. Я знаю, как создавать модели данных, я просто не знаю, как ссылаться и / или использовать и / или структурировать эти данные значимым образом, когда не используется SQL

3. «реляционные данные, поставляемые с приложением» — почему вы не предоставляете предварительно заполненную базу данных SQLite в своем приложении?

4. Я бы хотел это сделать, хотя в большинстве руководств и / или обсуждений по созданию баз данных SQLite не показано, как инициализировать их данными, например ASP.Net/MVC учебные пособия / документы делают. Я также, кажется, вспоминаю, что слышал, что вы не должны этого делать из-за простоты непосредственного чтения пользователем вашей базы данных

5. существует множество сторонних инструментов SQLite, которые вы можете использовать для создания баз данных и заполнения данными вручную или с помощью импорта. Google «sqlite manager»

Ответ №1:

Читая комментарии к вашему сообщению, я пытаюсь сделать слепой снимок…

Поскольку я был новичком в Xamarin (из Windows Forms и Server), это тоже было проблемой для меня. Как сохранить? Большие ORM не работают …?!

Это относительно просто — вы используете Xamarin с его собственными правилами. Существует множество решений проблем, связанных с Xamarin, я постараюсь показать свое стандартное решение.

  • Создайте Xamarin-Project
  • Создайте библиотеку классов (предпочтительнее в .Net Standard)
  • Откройте диспетчер пакетов Nuget для библиотеки классов
  • Получите пакет «SQLite-Net Extensions»
  • Имя пакета: SQLiteNetExtensions
  • Я не думаю, что вам нужны какие-то пакеты MVVM для SQLiteExtensions
  • В этом блоге есть довольно хороший учебник о том, как инициализировать модель базы данных и как читать / записывать данные
  • Исходная база данных должна быть скопирована как файл-включить> в каждый независимый от платформы проект
  • С помощью PCLStorage или чего-то еще вы можете применить эту задачу, импортировав исходную базу данных в качестве источника ресурсов в ваше приложение xamarin и скопировав базу данных в нужное место.

Я всегда заканчиваю решением PCLStorage, как в этом gist

Один трюк с xamarin: попробуйте найти стандартные библиотеки .net, и вы должны (во многих случаях) иметь возможность использовать его на большинстве платформ xamarin.

Второе: следите за тем, чтобы readme-файлы открывались при импорте nuget!!! Это очень важно. Раньше я щелкал их и забывал почти каждую процедуру инициализации. Мне потребовались часы

В-третьих: существует множество nuget-библиотек, которые необходимо установить в базовом приложении и во всех приложениях, зависящих от платформы. Не забывайте, что в таких случаях, как SQLiteExtensions, будут установлены зависящие от платформы библиотеки.

(Ребята, не убивайте меня за это — я только пытаюсь помочь ;-))

Кстати: SQLiteExtensions использует IList или List … Если производительность является проблемой, вы можете переключиться на кэшированную ветку SQLiteExtensions позже (если вам нужно)

Комментарии:

1. Также в списке теперь EF Core

2. Пытался не упоминать EF Core, даже это может быть хорошим решением. Это должно показать быстрый способ разработки Xamarin с базами данных