С использованием SQLite внутри переносимой библиотеки классов - программирование
Подтвердить что ты не робот

С использованием SQLite внутри переносимой библиотеки классов

Недавно мы начали работу над новым проектом, который включает клиентов для Windows 8 Metro, Windows Phone и Desktop. было принято решение использовать шаблон MVVM в качестве основной архитектуры, поскольку совместное использование ViewModels между проектами является гораздо более приемлемым решением для нас.

мы решили использовать портативную библиотеку классов для этой цели, но проблема в том, что после загрузки и установки SQLite для Windows runtime из галереи расширения Visualstudio 2012, когда мы пытаемся добавить ссылку на соответствующие библиотеки, мы вообще не видим эти библиотеки. это заставляет нас думать, что невозможно использовать SQLite в проекте Portable class library.

Возможно, некоторые из них уже сделали это и знают, как мы могли бы достичь этой функциональности? пожалуйста, предоставьте нам правильный путь для разработки этой задачи, поскольку использование SQLite и использование многоразового кода очень важно на этом этапе разработки

4b9b3361

Ответ 1

В MvvmCross мы решаем это с помощью другого подхода.

Мы хотели воспользоваться собственными портами SQLite, и мы хотели использовать оболочку ORM SQLite-net из https://github.com/praeclarum/sqlite-net/

Поэтому вместо того, чтобы использовать только PCL, мы сделали следующее:


На уровне кода клиентские приложения могут использовать плагин как:

В библиотеке бизнес-логики (PCL или специфичной для платформы) код может определять объект модели:

public class ListItem
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
    public string WhenCreated { get; set; }
}

во время запуска приложение может вызвать:

  Cirrious.MvvmCross.Plugins.Sqlite.PluginLoader.Instance.EnsureLoaded();
  var factory = this.GetService<ISQLiteConnectionFactory>();
  var connection = factory.Create("SimpleList");
  connection.CreateTable<ListItem>();

то во время работы код может делать такие вещи, как:

  connection.Insert(new ListItem() { Name = TextToAdd, WhenCreated = DateTime.Now.ToString("HH:mm:ss ddd MMM yyyy") });

или

 public ListItem this[int index]
 {
     get { return _connection.Table<ListItem>().OrderBy(_sortOrder).Skip(index).FirstOrDefault(); }
 }

В то время как конкретный код пользовательского интерфейса должен ссылаться на расширение для платформы плагина и внедрять эту реализацию конкретной платформы в систему IoC/DI. На Droid это действительно просто (поскольку MonoDroid поддерживает Assembly.Load во время исполнения), но на других платформах это включает в себя немного кода котельной пластины, например:

    protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders)
    {
        loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Sqlite.WinRT.Plugin>();
        base.AddPluginsLoaders(loaders);
    }

Примечания:

  • текущее репо MvvmCross включает только обертки WinRT и MonoDroid SQLite, но другие (WP * и MonoTouch) должны быть легко построены (и я знаю, что другие их создали, но еще не внесли их обратно)

  • текущее репо MvvmCross включает только интерфейсы sync (не async) для WinRT, но опять же я знаю, что люди сказали мне, что они расширили это в своих частных проектах.

  • В настоящее время я пытаюсь вытащить эту плагиновую структуру за пределы MvvmCross, чтобы плагины можно было использовать более широко. Надеюсь ожидать объявления об этом до Xmas.

  • Подробнее о плагинах в MvvmCross см. https://speakerdeck.com/cirrious/mvvmcross-going-portable

Ответ 3

Возможно, стоит упомянуть, что атрибуты AutoIncrement и PrimaryKey относятся к следующему пространству имен

используя Cirrious.MvvmCross.Plugins.Sqlite;

  public class Reference : IBusinessEntity

    {

      public string Key { get; set; }

      public string Value { get; set; }



     [PrimaryKey, AutoIncrement]

      public long Id { get; set; }

  }

Ответ 4

После нескольких недель охоты на вещи я, наконец, решил, что вам нужно подключиться, используя:

var factory = new MvxWpfSqLiteConnectionFactory();

И я установил

using Cirrious.MvvmCross.Community.Plugins.Sqlite;
using Cirrious.MvvmCross.Community.Plugins.Sqlite.Wpf;
using Cirrious.CrossCore;

Для всех гениев MVVMcross там и всех гениев Sqlite там это может быть очевидно.

Никто не упоминает об этом в любом случае, и примеры для MVVMcross не будут компилировать или использовать Sqlite.NET, который не совместим с MVVM и PCL при фактическом подключении.

О, и это работает в Winforms, PCL и т.д. (я даже не использую Wpf).