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

相关文章

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

在Silverlight中动态绑定页面报表(PageReport)的数据源

ActiveReports 7中引入了一种新的报表模型——PageReport(页面布局报表),这种报表模型又细分了两种具体显示形式: o    固定页面布局...

1809
来自专栏静晴轩

sublime text下的Markdown写作

什么是 Markdown wiki Markdown 是一种方便记忆、书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如...

3477
来自专栏xiaoheike

Windows 托盘区域显示图标

这个结构体包含了向通知区域(底部任务栏右下角区域,下面都称为托盘)显示的信息。需要使用函数Shell_NotifyIcon。

1402
来自专栏zingpLiu

配置文件热加载的go语言实现

通常我们更新应用程序的配置文件,都需要手动重启程序或手动重新加载配置。假设一组服务部署在10台机器上,你需要借助批量运维工具执行重启命令,而且10台同时重启可能...

912
来自专栏韩东吉的Unity杂货铺

零基础入门 40:Inspector禁用RectTransform属性修改

Hello,今天给大家分享一下如何通过代码实现Inspector面板禁止修改RectTransform组件上的属性。

1822
来自专栏IMWeb前端团队

微型UI库Riot介绍

本文作者:IMWeb 黄龙 原文出处:IMWeb社区 未经同意,禁止转载 定义 Riot:类似 React 的微型 UI 库 特点: 自定义标签 快速...

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

【视频】自然框架之分页控件的使用方法(二) 下载、DLL说明和web.config的设置

  上次说的是QuickPager分页控件的PostBack的使用方式,也提供了源码下载。但是有些人下载之后发现有一大堆的文件夹,还有一大堆的DLL,到底要用哪...

1955
来自专栏程序员互动联盟

【Windows编程】系列第八篇:创建通用对话框

Windows系统之所以是目前最流行的桌面系统,也是因为Windows有一套标准化,统一友好的交互界面,比如菜单、工具栏、状态栏以及各个控件。当然除了这些单独的...

33314
来自专栏Porschev[钟慰]的专栏

体验vs11 Beta

第一步:下载VS11Beta 下载地址:http://www.microsoft.com/click/services/Redirect2.ashx?CR_...

1866
来自专栏施炯的IoT开发专栏

Windows Universal 应用 – Tip Calculator

声明     以下内容取材于 Bob Tabor 的课程《Windows Phone 8.1 Development for Absolute Beginner...

1678

扫码关注云+社区