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

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

Android 平台上的数据操作进行对比。

有时,键值对 和/或 文件两者不能满足您对数据存储的需求。特别是当您处理重复的结构化数据时,比如一些日程。对于这类信息,您需要使用的是关系存储。所谓的关系存储,通常是一个 SQL 数据库。 Android 和 Windows Phone 8 两个平台均支持使用 SQLite 关系数据库引擎。本文将会假设您已熟悉 Android 上的 SQLite。

安装 SQLite

您需要做的第一件事,是安装适用于 Windows Phone 应用程序的 SQLite,而这通过下载 SQLite for Windows Phone 这个包即可完成。

  1. 在 Visual Studio(译者注:以 VS 2017 简体中文版为翻译标准,下同)中,点击工具菜单,然后选择扩展和更新
  2. 在“扩展和更新”窗口左侧的树形目录中,点击联机,然后选择 Visual Studio 库
  3. 接下来,在右上角的搜索框中输入 sqlite,然后按回车键
  4. 此时应该出现 SQLite for Windows Phone 包,点击下载
  5. 随后会提示您点击安装,只需照做即可。
  6. 相应包被安装后,您需要重启一下 Visual Studio。

Android 提示

SQLite for Windows 包类似于 theandroid.database.sqlite 包。

添加一个引用到 SQLite

目前 SQLite 已被安装,接下来您需要从个人项目中添加一个对它的引用。

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

获取辅助类

最后,您需要做的是获取一些辅助类,这会让使用 SQLite 操作更易用。有不少辅助类可用于 Windows Phone 应用程序,其中我更喜欢使用 sqlite-net 库。

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

Visual Studio 提示

NuGet 是一款免费、开源的 .NET 框架包管理器。

  1. 右击您 Windows Phone 项目中的引用文件夹,然后选择 Manage NuGet Packages...
  2. 展开窗口左侧的 Online 节点。
  3. 在窗口右上角的搜索框中输入 sqlite回车
  4. 选择 sqlite-net 并点击 Install
  5. 两个源文件将被添加到您的项目:SQLite.csSQLiteAsync.cs
  6. 如果您查看错误列表,将会发现一些报错。这是因为 sqlite-net 依赖于尚未移植到 Windows Phone 8csharp-sqlite
  7. 要解决上述问题,您需要使用 sqlite-net-wp8 native C++ 项目,请到对应的 GitHub 项目仓库下载其 zip 压缩包版本。
  8. 右击下载的 zip 文件,点击属性,再点击取消阻止,然后点击确定
  9. 解压 zip 文件。
  10. 在 Visual Studio 的解决方案资源管理器中,右击当前解决方案并选择添加,然后选择现有项
  11. 在“添加现有项”对话框中,选择 Sqlite.vcxproj 文件,然后点击打开
  12. 您现在应该会在您的解决方案中看到 Sqlite 项目。
  13. 您需要将对 Sqlite 项目添加一个到您的 Windows Phone 项目的引用。右击 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 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;
}

您可使用以下代码从表格中检索单项记录:

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 中检索单项记录:

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

相关文章

来自专栏Java成神之路

Linux_服务器_02_在linux上怎么看eclipse控制台输出语句

在windows下,tomcat启动之后有一个黑窗口,很容易看到System.out.println或ex.printStackTrace这样的函数输出,非常方...

1034
来自专栏大数据钻研

如何编写简练清晰的HTML代码?

如何提升 Web 页面的性能,很多开发人员从多个方面来下手如 JavaScript、图像优化、服务器配置,文件压缩或是调整 CSS。 很显然 HTML 已经达到...

3446
来自专栏闪电gogogo的专栏

使用Ctex中遇到的一些问题

一般下载好Ctex,我是使用Latex+dvi2pdf完成编译的,但是发现推荐的使用为: 1)运行CCT & Latex命令生成两次dvi和ps文件

994
来自专栏Aloys的开发之路

javadoc相关问题

src源代码生成html格式文档:http://www.cnblogs.com/shenliang123/archive/2012/04/23/2466483....

20910
来自专栏影子

jQuery中的常用内容总结(二)

1064
来自专栏mini188

学习笔记:发现一个IE版本判断的好方法

web开发就不得不面对浏览器兼容性问题,特别是IE的兼容问题。在前端代码中经常要处理一些兼容格式,为了解决这个问题网上找了找识别浏览器版本的方法。 常规js方法...

1956
来自专栏Charlie's Road

Python文件读写保存操作

上面的代码其实没啥要介绍的,就是一个for循环然后逻辑和单个文件读操作一样,只是多了个写操作。

601
来自专栏Django中文社区

拓展 Django Pagination 实现完善的分页效果

在 使用 Django Pagination 实现简单的分页功能 中,我们实现了一个简单的分页导航效果。但想实现下面这样的一个比较完善的分页导航时,Django...

2906
来自专栏超然的博客

link 与 @import之对比

页面中使用CSS的方式主要有3种:行内添加定义style属性值,页面头部内嵌调用和外面链接调用,其中外面引用有两种:link和@import。外部引用CSS两种...

781
来自专栏影子

jQuery中的常用内容总结(二)

转载请注明地址: http://www.cnblogs.com/funnyzpc/p/7571993.html

743

扫码关注云+社区