在接下来的几篇文章中,我将介绍如何使用 Windows Phone 8 平台上的本地数据,并与 Android 平台相比较。
有时光靠普通键值对和/或文件并不能满足项目对数据存储的需求,尤其是当项目中包含大量重复的结构化数据(例如日历应用中的事件)时。对于这种类型的数据,你可能会希望使用一个关系型存储工具来处理。更为具体的说,一个 SQL 数据库。 Android 和 Windows Phone 8 都支持使用 SQLite 关系数据库引擎。本文假定你已经熟悉 Android 上 SQLite 的使用。
你需要做的第一件事就是安装适用于 Windows Phone 应用的 SQLite。只需要下载用于 Windows Phone 的 SQLite 包即可。
ANDROID提示
SQLite for Windows Package 包的作用与 android.database.sqlite 包类似。
现在 SQLite 已经安装,现在你需要为项目添加对 SQLite 的引用。
最后,你可能需要包含一些能够简化 SQLite 使用的帮助类。有许多针对 Windows Phone 平台开发的 SQLite 封装库。我个人偏好使用 sqlite-net库。
sqlite-net 库可以通过以下步骤从 NuGet 获得:
Visual Studio 提示
NuGet 是一个免费、开源的包管理器。适用于 .NET Framework 平台。
在本节的最后部分,我们将了解如何在 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);
}