从 Android 到 Windows Phone 8:使用 SQL 数据库

在接下来的几篇文章中,我将介绍如何使用 Windows Phone 8 平台上的本地数据,并与 Android 平台相比较。

有时光靠普通键值对和/或文件并不能满足项目对数据存储的需求,尤其是当项目中包含大量重复的结构化数据(例如日历应用中的事件)时。对于这种类型的数据,你可能会希望使用一个关系型存储工具来处理。更为具体的说,一个 SQL 数据库。 Android 和 Windows Phone 8 都支持使用 SQLite 关系数据库引擎。本文假定你已经熟悉 Android 上 SQLite 的使用。

安装SQLite

你需要做的第一件事就是安装适用于 Windows Phone 应用的 SQLite。只需要下载用于 Windows Phone 的 SQLite 包即可。

  1. 在 Visual Studio 中,单击“工具”菜单,然后单击“扩展和更新”。
  2. 在“扩展和更新”窗口左侧的目录树中,单击“Online”,然后单击“Visual Studio Gallery”。
  3. 接下来,在右上角的搜索框中输入 sqlite,然后按 Enter 键。
  4. 搜索结果中应该出现“SQLite for Windows Phone”包,点击“下载“。
  5. 随后会提示你是否安装,选择安装。
  6. 包安装完毕后,你需要重新启动 Visual Studio。

ANDROID提示

SQLite for Windows Package 包的作用与 android.database.sqlite 包类似。

添加对 SQLite 的引用

现在 SQLite 已经安装,现在你需要为项目添加对 SQLite 的引用。

  1. 右键单击项目目录中的”引用“文件夹,然后单击”添加引用...“。
  2. 在“引用管理器”窗口左侧的节点树中,展开 Windows Phone-Extensions 节点。
  3. 然后选择”SQLite for Windows Phone“,然后单击确定。
  4. 现在 SQLite 应该会出现在”引用“文件夹下。

使用帮助类

最后,你可能需要包含一些能够简化 SQLite 使用的帮助类。有许多针对 Windows Phone 平台开发的 SQLite 封装库。我个人偏好使用 sqlite-net库。

sqlite-net 库可以通过以下步骤从 NuGet 获得:

Visual Studio 提示

NuGet 是一个免费、开源的包管理器。适用于 .NET Framework 平台。

  1. 右键单击项目中的”引用“文件夹,然后单击 ”管理 NuGet 程序包……“。
  2. 展开窗口左侧的”Online“。
  3. 在窗口右上角的搜索框中输入 sqlite 并按 Enter 键。
  4. 选择 sqlite-net 并单击安装。
  5. 你的项目中将会出现两个源文件:SQLite.cs 和 SQLiteAsync.cs。
  6. 你可能会注意到出现了一些错误。这是因为 sqlite-net 依赖于尚未移植到 Windows Phone 8 平台的 csharp-sqlite 库。
  7. 要解决这个问题,你需要使用 sqlite-net-wp8 native C++ 项目。您首先需要到 GitHub 下载这个库。
  8. 右键单击下载的zip文件,单击“属性”,单击“取消阻止”,然后单击“确定”。
  9. 解压缩内容。
  10. 在 Visual Studio 中的解决方案资源管理器中,右键单击该解决方案并选择"添加",然后选择"现有项目"。
  11. 在“添加现有项目”对话框中,选择 Sqlite.vcxproj 文件,然后单击“打开”。
  12. 随后你的解决方案中会出现 Sqlite 项目。
  13. 现在为你的 Windows Phone 项目添加到 Sqlite 项目的引用。右键单击Windows Phone 项目的”引用“文件夹,然后单击”添加引用……“。
  14. 在”引用管理器“对话框中,从左侧节点树中选择”解决方案“,然后选择”项目“。
  15. 勾选 Sqlite 项目旁边的复选框,然后单击”确定“。
  16. 最后一步是向 Windows Phone 项目添加编译器指令。右键单击解决方案资源管理器中的Windows Phone项目,然后单击”属性“。
  17. 单击”生成“选项卡并将以下内容添加到条件编译符号文本框中:;USE_WP8_NATIVE_SQLITE。
  18. 按F6构建解决方案。现在应该不会有错误并能正常生成。

使用SQLite

在本节的最后部分,我们将了解如何在 Windows Phone 应用程序中使用SQLite 执行一些基本操作。

创建表

首先为你的应用创建一张表。举例来说,假设您的应用程序正在将博客文章存储在 SQLite 表中。通过你在上一节得到的 sqlite-net 包,你可以简单地写一个类来定义一张表。

public class Post
{ 
    [PrimaryKey]
    public int Id { get; set; }  
    public string Title { get; set; }  
    public string Text { get; set; } 
}

PrimaryKey 属性来自 sqlite-net 包。该包还提供的许多其他属性来定义表的结构。

表定义完成后,就可以创建它:

private async void CreateTable() 
{  
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("blog");  
    await conn.CreateTableAsync<Post>(); 
}

SQLiteAsyncConnection 类的构造函数中的 “blog” 参数指定了 SQLite 数据库的名称。

在对 CreateTableAsync 方法的调用中的 Post 类型指定了应该创建的表的结构,也就是之前定义的 Post 类。

Android 提示

在 Android 中,通过继承 SQLiteOpenHelper 类并实现以下方法,你可以简单的创建一张表。

public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE Post ( Id INTEGER PRIMARY KEY, Title TEXT, Text TEXT )"); 
}

插入数据

现在我们已经创建了一张表,使用以下代码可以将一条记录添加到表中:

public async void InsertPost(Post post) 
{
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("blog");
    await conn.InsertAsync(post); 
}

Android 提示

在 Android 中,您可以使用以下代码插入记录:

public void insertPost(SQLiteDatabase db, String title, String text ) {
   ContentValues values = new ContentValues();  
   values.put("Title", title);  
   values.put("Text", text);  
   long newRowId;  
   newRowId = db.insert("Post", null, values); 
}

检索记录

下面我们从表中获取所有记录,如下所示:

public async Task<List<Post>> GetPosts() 
{  
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("blog");
    var query = conn.Table<Post>();  
    var result = await query.ToListAsync();  
    return result; 
}

Android 提示

在 Android 中,你可以使用以下代码得到一个包含所有记录的 Cursor 对象:

public Cursor getPosts(SQLiteDatabase db){
  String[] projection = {"Id", "Title", "Text" };
  Cursor c = db.query("Post", projection, null, null, null, null, null);  
  return c; 
}

如果要根据 id 查找某条记录:

public async Task<Post> GetPost(int id) 
{   
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("blog");  
    var query = conn.Table<Post>().Where(x => x.Id == id);  
    var result = await query.ToListAsync();  
    return result.FirstOrDefault(); 
}

Android 提示

使用以下代码来在 Android 中通过 id 查找记录:

public Cursor getPost(SQLiteDatabase db, Integer id){  
  String[] projection = {"Id", "Title", "Text" };  
  String selection = "Id LIKE ?";  
  String[] selelectionArgs = { String.valueOf(id) };  
  Cursor c = db.query( "Post", projection, selection, selectionArgs, null, null, null);  
  return c; 
}

更新记录

更新某条记录可以用下面的方法:

public async void UpdatePost(Post post) 
{  
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("blog");  
    await conn.UpdateAsync(post); 
}

Android 提示

在 Android 中,你可以使用以下代码更新记录:

public void updatePost(SQLiteDatabase db, Integer id, String title, String text ) {
  ContentValues values = new ContentValues();  
  values.put("Title", title);  
  values.put("Text", text);  
  String selection = "Id LIKE ?";  
  String[] selelectionArgs = { String.valueOf(id) };  
  int count = db.update("Post, values, selection, selectionArgs); 
}

删除记录

删除特定的记录:

public async void DeletePost(Post post) {
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection("blog");  
    await conn.DeleteAsync(post); 
}

Android 提示

在 Android 中,你可以使用以下代码来删除记录:

public void deletePost(SQLiteDatabase db, Integer id ) {
  String selection = "Id LIKE ?";  
  String[] selelectionArgs = { String.valueOf(id) };  
  db.delete("Post", selection, selectionArgs); 
}

本文的版权归 沈星繁 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

前言   前面一有写到一篇Node.js+Express构建网站简单示例https://cloud.tencent.com/developer/article/...

2K9
来自专栏WindCoder

WordPress代码实现自动拒绝包含特定关键词的垃圾评论

经常受到类似的垃圾评论,有点懒得动手删了,于是百度出自动拒绝特定关键字的评论的方法并记于此处。

882
来自专栏郭霖

Android数据库高手秘籍(三)——使用LitePal升级表

在上一篇文章中,我们学习了LitePal的基本用法,体验了使用框架来进行创建表操作的便利。然而大家都知道,创建表只是数据库操作中最基本的一步而已,我们在一开始创...

2825
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作

4045
来自专栏NetCore

[实录]解决Migrator.Net 小bug

好久没写了,平时比较忙,只能趁周末的时候,写一点小东西,自己也记录一下。 平时我们做项目的时候,都会有自己的数据访问层,为了能方便以后的升级,我们一般会抽象出数...

2165
来自专栏python3

django操作非ORM创建的表

工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢?

1142
来自专栏乐沙弥的世界

RMAN 数据库克隆文件位置转换方法

      在使用RMAN克隆数据库时,如果辅助数据库(新数据库)使用了与目标数据库(原数据库)使用了不同的路径,那么就存在位置转换的问题。在Oracle中,控...

671
来自专栏pangguoming

PowerDesigner使用教程|使用方法

PowerDesigner安装方法: http://dev.firnow.com/course/3_program/java/javajs/20090908/...

4376
来自专栏技术翻译

关于Couchbase-Dzone数据库,你必须了解的10件事情

此功能已经存在了一段时间,但仍值得一提。一些Key-Value Store只允许你将整个文档全部整合在一起,这是一个合理的。但是,如果你使用Couchbase作...

1450
来自专栏bboysoul

磁盘分析工具Ncdu的简单使用和体验

因为我使用的是120g的固态硬盘,所以我的本地就不能存很多东西,经常要删除很多东西,所以看每个目录的大小就很重要,下面推荐一个磁盘分析工具Ncdu,这个工具是用...

661

扫码关注云+社区