使用 Akavache 缓存

关于 Akavache

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

Xamarin 的建议

如果只是你不需要使用强相对数据,二进制或非常大量的数据来操作,Akavache 绝对是 Xamarin 应用程序的最佳缓存库。在以下情况下使用 Akavache:

  • 你需要应用程序在给定的时间段内缓存数据(你可以为要保存的每个实体配置到期超时;
  • 你希望你的应用离线工作;
  • 很难确定和冻结数据的架构。例如,你有包含不同类型对象的列表;
  • 只需对数据进行简单的键值访问即可,你无需进行复杂的查询。

Akavache 不是数据存储的银弹,所以在下列情况下请三思而后行:

  • 你的数据实体之间有很多关系;
  • 你并不需要你的应用离线工作;
  • 你需要在本地保存大量数据;
  • 你需要将数据从版本迁移到版本;
  • 你需要执行 SQL 的典型复杂查询,例如分组,投影等。

实际上,只需通过读取和写回更新的字段即可手动迁移数据。

简单的例子

与 Akavache 的交互主要通过名为 BlobCache 的对象完成。

大多数 Akavache 的方法返回反应式 observable,但是你也可以通过扩展方法等待它们。

using System.Reactive.Linq;   // IMPORTANT - this makes await work!

// Make sure you set the application name before doing any inserts or gets
BlobCache.ApplicationName = "AkavacheExperiment";

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

//
// ...later, in another part of town...
//

// Using async/await
var toaster = await BlobCache.UserAccount.GetObject<Toaster>("toaster");

// or without async/await
Toaster toaster;

BlobCache.UserAccount.GetObject<Toaster>("toaster")
    .Subscribe(x => toaster = x, ex => Console.WriteLine("No Key!"));

错误处理

Toaster toaster;

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

// Or without async/await:
toaster = await BlobCache.UserAccount.GetObjectAsync<Toaster>("toaster")
    .Catch(Observable.Return(new Toaster()));