在便携式类库中使用SQLite

时间:2012-12-04 09:20:21

标签: c# sqlite windows-8 windows-phone-8 portable-class-library

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

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

也许您已经完成了一些并知道我们实现该功能的方式?请提供正确的方法来开发此任务,因为使用SQLite并且在开发的这个阶段拥有可重用的代码非常重要

4 个答案:

答案 0 :(得分: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 repo只包含WinRT和MonoDroid SQLite包装 - 但其他(WP *和MonoTouch)应该易于构建(我知道其他人已经构建了它们,但还没有贡献它们)

  • 当前的MvvmCross repo只包含WinRT的同步(非异步)接口 - 但我知道有人告诉我他们已经在私人项目中扩展了它。

  • 我目前正在将此插件结构拉到MvvmCross之外,以便可以更广泛地使用插件。希望在圣诞节前期待这个消息。

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

答案 1 :(得分:5)

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

New open source Portable Class Library for SQLite

答案 2 :(得分: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; }

  }

答案 3 :(得分:2)

经过几周的狩猎后,我终于想到你必须使用:

连接
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)。