在接下来的几篇文章中,您将了解如何使用 Windows Phone 8 平台上的本地数据,并将其与
Android 平台上的数据操作进行对比。
有时,键值对 和/或 文件两者不能满足您对数据存储的需求。特别是当您处理重复的结构化数据时,比如一些日程。对于这类信息,您需要使用的是关系存储。所谓的关系存储,通常是一个 SQL 数据库。 Android 和 Windows Phone 8 两个平台均支持使用 SQLite 关系数据库引擎。本文将会假设您已熟悉 Android 上的 SQLite。
您需要做的第一件事,是安装适用于 Windows Phone 应用程序的 SQLite,而这通过下载 SQLite for Windows Phone 这个包即可完成。
Android 提示
SQLite for Windows 包类似于 theandroid.database.sqlite 包。
目前 SQLite 已被安装,接下来您需要从个人项目中添加一个对它的引用。
最后,您需要做的是获取一些辅助类,这会让使用 SQLite 操作更易用。有不少辅助类可用于 Windows Phone 应用程序,其中我更喜欢使用 sqlite-net 库。
sqlite-net 库可以通过以下步骤从 NuGet 获得。
Visual Studio 提示
NuGet 是一款免费、开源的 .NET 框架包管理器。
最后,我们将介绍如何在 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);
}