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

相关文章

来自专栏北京马哥教育

Linux Shell 通配符、元字符、转义符最全使用攻略

来自:程默 - 博客园,作者:程默 www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html 说到she...

4286
来自专栏c#开发者

Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具

Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具 介绍 该工具是通过一个github上的开源项目修改的原始作者https...

4188
来自专栏程序员的SOD蜜

将复杂查询写到SQL配置文件--SOD框架的SQL-MAP技术简介

引言 今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每一个系的最高分,并且按系编号,学生编号升序排列。这个查询比较复杂,也比较典型,自...

28410
来自专栏jeremy的技术点滴

记录解决几个前端小问题的过程

4746
来自专栏逻辑熊猫带你玩Python

Python | “简易清单(EasyBill)增强版”

前情提要:关于本软件的前生今世可以查看笔者的历史文章《Python | “一个简单的清单软件easybill”》

842
来自专栏安恒网络空间安全讲武堂

MOCTF WEB 题解

0x00 MOCTF平台是CodeMonster和Mokirin这两支CTF战队所搭建的一个CTF在线答题系统。网址是http://www.moctf.com/...

6939
来自专栏信安之路

FeiFeiCms 前台逻辑漏洞分析

该函数直接将 post 的数据传入,则跟进ff_update函数至\Lib\Lib\Model\UserModel.class.php文件

120
来自专栏张善友的专栏

WiX安装选项---开始菜单项

参考文档: How To: Create a Shortcut on the Start Menu,How To: Create an Uninstall Sh...

21110
来自专栏凉城

[教程]黑客级别的批量处理文件

1905
来自专栏极客日常

利用cert-manager让Ingress启用免费的HTTPS证书

cert-manager 是替代 kube-lego 的一个开源项目,用于在 Kubernetes 集群中自动提供 HTTPS 证书,支持 Let’s Encr...

2461

扫码关注云+社区