使用 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()));