Xamarin.Forms 使用Akavache缓存

示例

关于阿卡瓦契

Akavache是一个非常有用的库,提供了缓存数据的覆盖范围功能。Akavache提供了一个键值存储接口,并且可以在SQLite3的顶部使用。您实际上不需要使用架构同步,因为它实际上是No-SQL解决方案,它非常适合大多数移动应用程序,尤其是当您需要经常更新应用程序而又不会丢失数据时。

对Xamarin的建议

如果您不需要使用高度相关的数据,二进制数据或非常大量的数据,则Akavache绝对是Xamarin应用程序的最佳缓存库。在以下情况下,请使用Akavache:

  • 您需要您的应用在给定的时间段内缓存数据(您可以为每个要保存的实体配置过期超时;

  • 您希望您的应用程序可以脱机工作;

  • 很难确定和冻结数据的架构。例如,您有包含不同类型对象的列表。

  • 对数据进行简单的键值访问就足够了,而无需进行复杂的查询。

Akavache并不是数据存储的“灵丹妙药”,因此在以下情况下,请三思而后行:

  • 您的数据实体之间有很多关系。

  • 您实际上并不需要离线运行应用程序;

  • 您有大量数据要保存在本地;

  • 您需要将数据从一个版本迁移到另一个版本。

  • 您需要执行典型的SQL复杂查询,例如分组,投影等。

实际上,您可以通过使用更新的字段进行读写来手动迁移数据。

简单的例子

与Akavache的互动主要是通过称为的对象完成的BlobCache。

Akavache的大多数方法都返回反应式可观测值,但是由于扩展方法,您也可以等待它们。

using System.Reactive.Linq;   // 重要提示-这使等待工作!

// 在进行任何插入或获取操作之前,请确保设置了应用程序名称
BlobCache.ApplicationName = "AkavacheExperiment";

var myToaster = new Toaster();
await BlobCache.UserAccount.InsertObject("toaster", myToaster);

//
// 后来在城镇的另一部分
//

// 使用异步/等待
var toaster = await BlobCache.UserAccount.GetObject<Toaster>("toaster");

// 或没有异步/等待
Toaster toaster;

BlobCache.UserAccount.GetObject<Toaster>("toaster")
    .Subscribe(x => toaster = x, ex => Console.WriteLine("没有钥匙!"));

错误处理

Toaster toaster;

try {
    toaster = await BlobCache.UserAccount.GetObjectAsync("toaster");
} catch (KeyNotFoundException ex) {
    toaster = new Toaster();
}

// 或没有异步/等待:
toaster = await BlobCache.UserAccount.GetObjectAsync<Toaster>("toaster")
    .Catch(Observable.Return(new Toaster()));