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

相关文章

来自专栏编程心路

SSH框架之旅-hibernate(1)

什么是框架呢?个人觉得在软件设计中,框架可以看作是架构组件。如果把整个程序看作是一个人的话,那么框架可以看出是一个人的骨架,我们要做的的就是在这个框架的基础上进...

633
来自专栏owent

非常帅气的Linq to sql

Linq是.NET 3里新增的东西,我在软件工程课程设计里初步应用到一点,而且主要用在Lambda表达式上,今天算是在好奇心驱动下尝试了一下在数据库方面的应用。

341
来自专栏木头编程 - moTzxx

PHP 学习筆記[1] —— ThinkPHP 公共函数整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

754
来自专栏吴小龙同學

Android NDK 入门与实践

NDK 是什么 NDK 全称 Native Development Kit,可以让您在 Android 应用中调用 C 或 C++ 代码的工具。 NDK 好处 ...

3496
来自专栏码神联盟

碎片化 | 第四阶段-29-Struts2入门示例1-视频

如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/u0565acptbm.html 入门示例 1.hello Stru...

3328
来自专栏我和未来有约会

Silverlight本地化

ilverlight本地化 简单的实现多语言版本的Silverlight应用。 日益国际化的同时,需要我们开发的应用根据不同的来访者显示不用的语言,Silv...

17810
来自专栏Danny的专栏

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

632
来自专栏Golang语言社区

【Go 语言,服务器模块】日志系统源码

后台服务器开发中,日志系统是针对运行的程序的检测,或者是后台统计功能的记录。 例如: 要求统计每日用户的访问量,可以通过统计日志的方式实现。 如下代码,自己...

3084
来自专栏林德熙的博客

win 10 UWP 标签

本文主要翻译:http://visuallylocated.com/post/2015/02/20/Creating-a-WrapPanel-for-your-...

632
来自专栏码神联盟

碎片化 | 第四阶段-30-Struts2入门示例流程梳理-视频

如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/h056559mlsg.html 入门示例 1.hello Stru...

3299

扫码关注云+社区