从 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 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何使用Sentry管理Hive外部表(补充)

/extwarehouse/student_hive数据目录不存,在创建外部表时自动生成,且数据目录属主为hive。

3474
来自专栏mukekeheart的iOS之旅

iOS模拟器使用

  在iOS开发过程中一直都是使用模拟器进行调试,在模拟器上有很多不适应的地方,但是其实在模拟器上也有很多其他的功能,在本文中主要对模拟器的一些基本功能进行总结...

733
来自专栏张戈的专栏

修复WordPress升级4.2外观菜单中显示选项无法点击问题

WordPress 升级 4.2 之后,目前发现存在如下 3 个问题: 有部分主题的前台会产生大量的 404 错误请求(站外资源); 评论表情名称变更导致表情无...

2616
来自专栏Hadoop实操

如何使用HBase存储文本文件

1593
来自专栏老安的博客

vmware api开发之快照管理

1324
来自专栏静晴轩

Gulp折腾之路(II)

前段时间折腾Gulp,主要是搜寻一些插件,组合之以优化前端开发流程。这段折腾历程除了达成所愿外,给予最大的收获是:只要你想实现某功能,基本就已有对应插件供使用;...

3255
来自专栏Java技术

Jenkins指定具体分支持续集成-使用Generic Webhook Trigger插件和码云

使用Generic Webhook Trigger插件实现Jenkins+WebHooks(码云)持续集成

662
来自专栏乐百川的学习频道

django 快速入门

Django是Python语言编写的一个全栈式Web框架,可以帮助我们快速编写一个具有数据库功能、增删查改、后台管理等功能的网站。假如你只需要一些很简单的功能,...

2116
来自专栏葡萄城控件技术团队

图解AngularJS Wijmo5和LightSwitch

Visual Studio 2013 中的 LightSwitch 有新增功能,包括更好的团队开发支持以及在构建 HTML 客户端桌面和 Office 365 ...

1829

Android 转 Windows Phone 8:SQL 数据库的操作

在接下来的几篇文章中,您将了解如何使用 Windows Phone 8 平台上的本地数据,并将其与

1718

扫码关注云+社区