65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SQLite 作为通用应用的本地数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (18投票s)

2014 年 10 月 7 日

Ms-PL

6分钟阅读

viewsIcon

84771

这是一份关于在 Windows 通用应用中使用 SQLite 作为通用本地数据库的非常基础和原始的指南。

开篇

通常,当我们把现有的 Windows Phone 8 / Windows Phone Silverlight 项目迁移到通用应用时,一个普遍的问题是应该在其中使用什么作为本地数据库。SQLite 非常适合作为通用应用的本地数据库。因此,如果您想在您的通用应用中为两个项目使用相同的数据库,请继续关注这里。那么,我们开始吧?

通用应用

通用应用是为 Windows 应用商店设计的最新应用模型,通过同一个项目和共享代码,可以根据您的喜好为 Windows 应用商店和 Windows Phone 应用商店提供应用。对于那些不知道什么是通用应用的人,请访问此链接,以便您能全面了解其工作原理。对于已经了解的人,请继续。

SQLite 与通用应用

要让 SQLite 与您的通用应用协同工作,我们首先要做的就是为 Windows Phone 8.1 和 Windows Runtime 8.1 获取 SQLite,因为通用应用指向这两者。

要为 Windows 应用商店安装 SQLite,请访问
http://visualstudiogallery.msdn.microsoft.com/1d04f82f-2fe9-4727-a2f9-a2db127ddc9a/view/

您会看到类似以下的屏幕

所以,接下来要做的肯定是下载这个。一旦 VSIX 安装程序下载完成,就进行安装。既然我们现在有了 Windows 应用商店的 SQLite,我们接着来获取 Windows Phone 的 SQLite。

要为 Windows Phone 8.1 安装 SQLite,请访问
http://visualstudiogallery.msdn.microsoft.com/5d97faf6-39e3-4048-a0bc-adde2af75d1b

这将导向一个类似的页面,下载 VSIX 安装程序并安装它。接下来,我们需要检查一下我们是否在 Visual Studio 中安装了我们需要的东西。我这里使用的是 Visual Studio 2013 Ultimate 版本,我们进入“工具”->“扩展和更新”,然后在“已安装”下的“SDK”部分。您会看到“SQLite for Windows Runtime”和“SQLite for Windows Phone 8.1”已列为已安装在您的电脑上。

 

既然我们确信我们已经为 Windows Phone 8.1 和 Windows 应用商店应用安装了 SQLite,那么就在 Visual Studio 中创建一个新的通用应用项目吧。

SQLite 与通用应用

创建通用应用与 Visual Studio 中的其他项目非常相似。只需进入“文件”->“新建项目”,然后在“应用商店应用”下,创建一个名为 UniversalSQLite 的空白通用应用。

 

 

在解决方案资源管理器中,您会看到您的项目分为 Windows 应用商店、Windows Phone 和共享。我们的任务现在是将 SQLite 引用到 Windows 应用商店和 Windows Phone 项目中,以便这两个项目都能访问 SQLite。在 Windows 8.1 解决方案中,进入您的引用,并添加对新添加的扩展下的 SQLite 库的引用。

 

对 Windows Phone 8.1 解决方案也做同样的事情。进入引用,并添加对新安装的 Windows Phone 8.1 SQLite 库的引用。


您会看到新引用的库上有一些黄色的感叹号,现在最好的做法是进行构建。您在构建时遇到的第一个问题会是这个

实际上,这个问题本身就说明了解决方案。由于这些原生库对机器的依赖性非常强,这里最好的做法就是进入配置管理器,并将两个项目的平台都设置为 x86。



尝试 x64 会导致 XAML 设计器无法渲染 UI。所以 x86 是更安全的选择。不用担心,这不会阻止您为商店创建不同的平台版本进行部署。

当您准备好时,只需使用“创建应用包”命令。最好的获取方法是右键单击解决方案名称,然后转到“应用商店”菜单。但那是之后的事情。

 

从 Nuget 获取 sqlite-net

好了,如果您现在进行构建,您会看到一切都顺利了。现在,还剩下使用 SQLite。我们需要做的第一件事是获取一个 nuget 包来处理 SQLite 的所有内部复杂性,这时 sqlite-net 就派上用场了。这个小巧的 nuget 包非常方便,您需要做的就是进入引用并管理 nuget 包。搜索 sqlite-net,并在搜索结果出现时添加它。

 

当然,这必须对 Windows 8.1 和 Windows Phone 8.1 项目都进行,因为我们打算将它用于两者。您会看到在两个项目中都创建了两个名为 SQLite.cs 和 SQLiteAsync.cs 的类。为了避免重复,您可以将它们移动到共享项目中,放在一个文件夹下。

 

让我们开始动手

那么,让我们开始写一些代码吧,好吗?

创建/打开数据库

要创建/打开数据库,您所要做的就是像下面这样。如果数据库不存在,它会实际创建一个数据库;如果存在,它会打开一个连接。

SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");

因此,在这样做之前,您可能想检查一下数据库是否存在。

public async Task<bool> DoesDbExist(string DatabaseName)
{
      bool dbexist = true;
      try
      {
         StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(DatabaseName);

      }
      catch
      {
         dbexist = false;
      }

      return dbexist;
}

我们之所以查看 ApplicationData.Current.LocalFolder,是因为 sqlite-net 默认在该位置创建数据库。

创建/打开数据库

在创建表之前,您需要一个模型来定义该特定表中的一行。模型可能看起来像这样

using SQLite;


namespace UniversalSqlLite.Model
{
    [Table("Students")]
    public class Student
    {
        [PrimaryKey, AutoIncrement]
        public int id { get; set; }

        public string Name { get; set; }

        public string EnrolledCourse { get; set; }

    }
}

现在您可以按照自己的意愿创建表了。

public async void CreateDatabase()
{
   SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");
   await connection.CreateTableAsync<Student>();
}

CreateTableAsync 会在表不存在时创建它。如果模型与之前的任何方式发生变化,它都会更新表描述。目前,它只支持添加列。它不会销毁任何现有的 SQLite 表。所以,您不必担心与现有表重新创建。

如果您仔细看,您会发现您可以使用 sqllite-net 库中定义的属性来装饰模型中的类和属性。这几乎和您在 Entity Framework 中看到的一样。

完整列表可以在这里找到

类属性

  • [Table(Name)]

属性属性

  • [AutoIncrement]
  • [PrimaryKey]
  • [Column(Name)]
  • [Indexed] | [Indexed(string name, int order)]
  • [Unique]
  • [Ignore]
  • [MaxLength(int length)]
  • [Collation(string name)]
  • [NotNull]

删除表

删除表也是小菜一碟

public async void DropDatabase()
{
    SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");
    await connection.DropTableAsync<Student>();
}

向表中添加记录

插入到 SQLite 很容易,如下所示

SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");
var Student=new Student()
{
   Name="Swagata Prateek",
   EnrolledCourse="CSE 4203"
};
await connection.InsertAsync(Student);

如果您想一次插入大量数据,为什么不使用列表呢?

SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");

var StudentList = new List<Student>()
{
    new Student()
    {
        Name="Swagata Prateek",
        EnrolledCourse="CSE 4203"
        },
        new Student()
        {
            Name="Abidur Rahman",
            EnrolledCourse="CSE 4203"
        },
        new Student()
        {
            Name="Ashiqur Rahman",
            EnrolledCourse="CSE 4203"
        }
    };
            
await connection.InsertAllAsync(StudentList);

执行查询

您可以通过多种方式在 SQLite 中进行查询。让我们来看看如果我们想使用 LINQ 来实现,会是什么样子

SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");
var queryVar=await connection.Table<Student>().Where(x=>x.Name.StartsWith("Swagata"));

var queryResult = await queryVar.ToListAsync();
foreach (var item in queryResult)
{
    //Do your stuff
}

如果您愿意,您甚至可以进行手动 SQL 查询

SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");
var result = await connection.QueryAsync<Student>("Select Name FROM Students WHERE EnrolledCourse = ?", new object[] { "CSE 4203"});
foreach (var item in result)
{
    //Do your stuff
}

更新和删除记录

任何记录在检索并更新回表中后都可以被更新。

SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");
var Student=await connection.Table<Student>().Where(x=>x.Name.StartsWith("Swagata")).FirstOrDefaultAsync();

if(Student != null)
{
    Student.EnrolledCourse = "CSE 4503";
    await connection.UpdateAsync(Student);
}

如果您想删除相同的记录,您只需要

 SQLiteAsyncConnection connection = new SQLiteAsyncConnection("Student.db");
var Student=await connection.Table<Student>().Where(x=>x.Name.StartsWith("Swagata")).FirstOrDefaultAsync();

if(Student != null)
{
    await connection.DeleteAsync(Student);
}

总结

我们将在下一篇文章中深入探讨查询并以此创建一个示例应用。在此期间,您还可以参考 Nicolò Carandini 的关于使用 SQLite 和通用应用的博客,链接如下。

  1. 带 SQLite 的通用应用第一部分
  2. 带 SQLite 的通用应用第二部分

希望大家玩得开心!

© . All rights reserved.