Win10 UWP 开发系列:支持异步的SQLite

转载 2016年01月05日 10:00:34

上篇文章已经实现了在UWP中使用SQLite作为本地存储,作为移动端的程序,及时响应用户的操作是提高用户体验的重要途径,因此UWP的很多api都是异步的。那么如何使SQLite支持异步呢?


参考SQLite.Net-PCLgithub页面:https://github.com/oysteinkrog/SQLite.Net-PCL


可以看到SQLite.Net-PCL是支持异步的,在创建数据库链接的时候,可以创建同步的SQLiteConnection,也可以创建异步的SQliteAsyncConnection


SQliteAsyncConnection

The SQLiteAsyncConnection class now takes a Func in the constructor instead of a path. This is done because the async classes are now just meant to be wrappers around the normal sqlite connection.

To use SQLiteAsyncConnection just create an instance of a SQLiteConnectionWithLock and pass in that through a func, e.g.: new SQLiteAsyncConnection(()=>_sqliteConnectionWithLock);

Please be aware that the Task.Run pattern used in SQLiteAsyncConnection can be considered an anti-pattern (libraries should not provide async methods unless they are truly async). This class is maintained for backwards compatability and for use-cases where async-isolation is handy.


在之前的版本中,创建SQLiteAsyncConnectionSQLiteConnection的写法是类似的,都是传入一个数据库文件地址即可,但新版本中异步的构造函数有点变化,需要传入一个Func


接下来我们看一下如何使用异步的方式来使用SQLite


一、添加SQLite.Net.Async-PCL支持


还是在上个例子里直接改吧,首先我们之前添加的SQLite.Net-PCL是不支持异步的,需要添加另一个nuget包:



装了这个就可以使用异步的了。


二、创建异步的数据库链接


public SQLiteAsyncConnection GetDbConnectionAsync()

 

{

var connectionFactory = new Func<SQLiteConnectionWithLock>(() => new SQLiteConnectionWithLock(new SQLitePlatformWinRT(), new SQLiteConnectionString(DbFilePath, storeDateTimeAsTicks: false)));

var asyncConnection = new SQLiteAsyncConnection(connectionFactory);

return asyncConnection;

把初始化方法改为:

public async Task InitAsync()

 

{

 

DbFilePath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, DbFileName);

var db = GetDbConnectionAsync();

await db.CreateTableAsync<UserItem>();

 

}

注意要在StartupFunctions.cs文件里调用这个异步的,把原来那个Init方法注释掉。


三、异步访问数据库


其实之后就没有太多可说的了,就是把原来的同步方法改成异步的就可以了,比如插入数据:

public async Task<int> InsertUserAsync(UserItem item)

 

{

int result = 0;

var conn = DbContext.Instance.GetDbConnectionAsync();

 

result = await conn.InsertAsync(item);

return result;

 

}

获取全部数据:

public async Task<List<UserItem>> GetAllUserAsync()

 

{

 

List<UserItem> result = new List<UserItem>();

var conn = DbContext.Instance.GetDbConnectionAsync();

 

result = await conn.Table<UserItem>().ToListAsync();

return result;

 

}



 查询的话可以这样:

public async Task<List<UserItem>> GetUserListAsync(string key)

 

{

 

List<UserItem> result = new List<UserItem>();

var conn = DbContext.Instance.GetDbConnectionAsync();

 

result = await conn.Table<UserItem>().Where(x => x.UserName.Contains(key)).ToListAsync();

return result;

 

}

其他几个UpdateDelete也有相应的异步方法,就不写了。

还有几个方法是QueryAsyncExecuteAsyncExecuteScalarAsync等等,都可以直接执行sql语句,例如:

public async Task<int> GetUserCount()

 

{

var conn = DbContext.Instance.GetDbConnectionAsync();

return await conn.ExecuteScalarAsync<int>("select count(*) from UserItem");

 

}

建议使用异步的方式以获得更好的性能。


开发者交流群:53078485期待您的加入!

Win10 UWP 开发系列:支持异步的SQLite

上篇文章已经实现了在UWP中使用SQLite作为本地存储,作为移动端的程序,及时响应用户的操作是提高用户体验的重要途径,因此UWP的很多api都是异步的。那么如何使SQLite支持异步呢? 参考SQL...
  • igweyou
  • igweyou
  • 2016年01月05日 10:00
  • 1289

Win10 UWP 开发系列:使用SQLite

在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中。但如果数据多的话,还是需要本地数据库的支持。在UWP开发中...
  • igweyou
  • igweyou
  • 2015年12月31日 10:16
  • 1188

Win10开发:SQLite 的使用

SQLite是一款轻型的数据库,网上关于SQLite的介绍太多,我就不专门废话介绍了。 SQLite的作用一言以蔽之,就是如果你做移动应用,需要用的数据库,那就推荐用SQLite。 而关于SQLi...
  • zmq570235977
  • zmq570235977
  • 2015年12月24日 21:17
  • 3023

Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航

在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便。全景视图因为对设计要求比较高,自己总是做不出好的效果。对于一般的新闻阅读类Ap...
  • igweyou
  • igweyou
  • 2016年01月14日 13:27
  • 1826

Win 10 UWP开发系列:设置AppBarButton的图标

在WP8以前,页面最下面的四个小圆按钮是不支持绑定的,WP8.1 RT之后,系统按钮升级成了AppBarButton,并且支持绑定了。在Win10 UWP开发中,按钮的样式发生了变化,外面的圆圈没有了...
  • igweyou
  • igweyou
  • 2016年01月12日 10:12
  • 1814

win10 uwp 异步进度条

本文主要讲我设计的几个进度条,还有如何使用异步控制进度条,如何使用动画做进度。进度条可以参见:http://edi.wang/post/2016/2/25/windows-10-uwp-modal-p...
  • lindexi_gd
  • lindexi_gd
  • 2016年09月19日 10:30
  • 2407

Win10/UWP新特性系列—使用打印机

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备...
  • igweyou
  • igweyou
  • 2015年12月10日 09:26
  • 1114

Win10 UWP 开发教程 课程 资源

  • 2017年09月27日 13:15
  • 48B
  • 下载

Win10/UWP开发—凭据保险箱PasswordVault

PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据。 那...
  • igweyou
  • igweyou
  • 2015年12月15日 10:24
  • 1168

Win10/UWP开发—使用Cortana语音指令启动前台App

这两天进群(53078485)找大咖的童鞋比较多,只是大咖比较忙,目前Demo还没有要到,这里先给大家转载一篇Aran大咖的博客学习下,以下是原文:   Win10开发中最具有系统特色的功能点绝对...
  • igweyou
  • igweyou
  • 2015年09月17日 14:16
  • 1122
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win10 UWP 开发系列:支持异步的SQLite
举报原因:
原因补充:

(最多只允许输入30个字)