从 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/...

2.3K90
来自专栏小尘哥的专栏

springboot之文件上传、图片预览(thymeleaf+layui)

1、上传 ①.使用spring的正常上传,文件存储路径为磁盘任意位置,可配置 ②.业务表中存附件id ③.前端使用Layui 2、预览 ①.使用nginx代理,...

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

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

46450
来自专栏更流畅、简洁的软件开发方式

【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。

分页控件的源代码下载网址:http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html (在网页的下...

230100
来自专栏郭霖

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

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

31050
来自专栏数据和云

【循序渐进Oracle】Oracle的逻辑备份与恢复

编辑手记:针对最近发生的炉石及GitLab事件,我们不得不再次强调备份的重要性。DBA的四大守则,第一条就是备份重于一切。年初做好备份,愿你的系统17无恙。 本...

47180
来自专栏pangguoming

PowerDesigner使用教程|使用方法

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

54560
来自专栏IT探索

eclipse tipse....to be continued forever.

1.Access restriction: ....is not accessible due to restriction on required libra...

8510
来自专栏WindCoder

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

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

11320
来自专栏架构之路

悲观锁&乐观锁

最近意外发现之前对悲观锁乐观锁的理解有误,所以重新学习了一下。 1.悲观锁 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事...

32740

扫码关注云+社区

领取腾讯云代金券