15

最近我们开始着手一个新项目,其中包括 Windows 8 Metro、Windows Phone 和桌面应用程序的客户端。决定使用 MVVM 模式作为主要架构,因为在项目之间共享 ViewModel 对我们来说是更容易接受的解决方案。

我们决定为此目的使用可移植类库,但问题是从 Visualstudio 2012 扩展库下载并安装 SQLite for Windows 运行时后,当我们尝试添加对适当库的引用时,我们根本看不到这些库。这让我们想到,在可移植类库项目中使用 SQLite 是不可能的。

也许你们中的一些人已经这样做了并且知道我们可以实现该功能的方式?请为我们提供开发此任务的正确方法,因为在此开发阶段使用 SQLite 和可重用代码非常重要

4

4 回答 4

20

在 MvvmCross 中,我们通过不同的方法解决了这个问题。

我们想利用 SQLite 的本地端口,我们想使用来自https://github.com/praeclarum/sqlite-net/的 SQLite-net ORM 包装器

因此,我们所做的不仅仅是使用 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(); }
 }

而 UI 特定代码必须引用插件的特定于平台的扩展并将该平台特定的实现注入到 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 存储库仅包括 WinRT 的同步(非异步)接口 - 但我再次知道人们告诉我他们已经在他们的私人项目中扩展了这个。

  • 我目前正在将这个插件结构拉到 MvvmCross 之外,以便可以更广泛地使用插件。希望圣诞节前能有一个公告。

  • 有关 MvvmCross 插件的更多信息,请参阅https://speakerdeck.com/cirrious/mvvmcross-going-portable

于 2012-12-04T16:15:59.710 回答
5

Stuart 很好地解释了如何使用 SQLite 创建 PCL,但今天我发现了这种方法,我希望它可以更好地解决任何其他问题

用于 SQLite 的新开源可移植类库

于 2014-02-05T15:17:20.787 回答
2

可能值得一提的是 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; }

  }
于 2013-06-09T23:08:04.847 回答
2

经过数周的搜寻,我终于认为您必须使用以下方式进行连接:

var factory = new MvxWpfSqLiteConnectionFactory();

我安装了

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

对于那里的所有 MVVMcross 天才和所有 Sqlite 天才来说,这可能是显而易见的。

没有人在任何地方提到这一点,并且 MVVMcross 的示例在实际进行连接时都不会编译或使用与 MVVM 或 PCL 不兼容的 Sqlite.NET。

哦,这适用于 Winforms、PCL 等(我什至不使用 Wpf)。

于 2013-12-22T06:15:36.917 回答