2017-01-30 61 views
0

我應該使用akavache作爲我的xamarin表單應用程序中的主要本地數據庫還是另一個sqlite數據庫頂部的緩存數據庫?因爲我找不到任何如何更新,插入,刪除akavache對象中的數據的例子。例如,如何更新/插入/刪除akavache列表對象中的項目?

CacheExercises = await BlobCache.LocalMachine.GetOrFetchObject<List<Item>>("CacheItems", 
        async() => await getdatafromAzure(recursive)); 

我收到來自Azure和商店物品在本地機器上,這些項目是可編輯/可刪除或用戶可以添加一個新的項目。我該怎麼做?

+0

您是否測試了其他獲取插入和刪除方法? https://github.com/akavache/Akavache – Depechie

+0

@Depechie也許我不明白插入的目的,但這會創建全新的對象到akavache緩存中,而不是?等待BlobCache.UserAccount.InsertObject(「CacheItems」,new item());這是否插入一個新的項目插入到我的CacheItems有一個項目列表類型。 – batmaci

+0

我以爲GetOr ***方法只是爲您做基地調用的重載。只要你使用相同的緩存鍵,我認爲你可以得到你需要的所有項目。 – Depechie

回答

1

任何保存到LocalMachine的內容都會持久保存到設備中。因此,對應用程序或設備重新啓動它仍然會在那裏(如果用戶不刪除應用程序或清除是數據)

至於如何訪問/保存有很多在這裏好樣 https://github.com/akavache/Akavache

插入對象和獲取的對象是你的基本的訪問方法,然後有很多的擴展方法一樣GetOrFetch,GetAndFetch,這是非常有用的

下面是一個簡單示例中,我還沒有超級測試給訪問的東西的一種方式。它可能會更好地使用一些擴展方法,但我認爲這樣的例子在概念上是有用的。

BlobCache.LocalMachine.GetObject<Tobject>(someKEy) 
      .Catch((KeyNotFoundException ke) => Observable.Return<Tobject>(null)) 
      .SelectMany(result => 
      { 
       //object doesn't exist in cache so create a new one 
       if (result == null) 
        result = new Tobject(); 

       //apply whatever updates you are wanting to do 
       //result.SomeField = "bob"; 

       //This will replace or insert data 
       return BlobCache.LocalMachine.InsertObject(someKEy, result); 

      }) 
      .Subscribe(); 

這真的是所有非常無聊的東西:-p只是得到一個對象,並存儲一個對象。在引擎蓋下Akavache做了很多非常酷的優化和同步那些無聊的東西,雖然讓它對我們其他人來說很無聊

在我大多數情況下,當我啓動一個虛擬機時,我從緩存中檢索對象然後將其作爲VM上的某些屬性或某個服務類中的某個屬性進行存儲。然後,當任何更改對該對象進行我只是將它插入到緩存

BlobCache.LocalMachine.InsertObject(someKEy, result).Subscribe() 

在這一點上我現在知道,如果應用程序關閉下來,我會擁有最新版本的該對象權當用戶啓動應用程序

我給的例子是更多訪問的整個RX方式......你必須在你原來的問題是什麼工作正常

 await BlobCache.LocalMachine.GetOrFetchObject<List<object>>("CacheItems", 
       async() => await getdatafromAzure(recursive)); 

這基本上都會檢查緩存,如果它不存在,那麼它去到Azure ...

LocalMachine存儲到物理設備,InMemory只存儲一些內部字典,一旦應用程序從內存中卸載,它就消失,UserAccount與NT遠程處理帳戶一起使用。

+0

您是否必須真正檢查它是否存在或者何時插入,它是否已經處理插入(如果不存在),如果存在則更新現有的值,還是重複該值?順便說一句,爲什麼你總是添加Subscribe後綴?這有什麼好的理由? – batmaci

+0

基本上我剛剛實現了類似的邏輯,我使用靜態列表來保存內存,而應用程序正在使用,每次應用程序都重新初始化,我正在從akavache緩存中填充它。這就是爲什麼我對InMemory選項感到好奇,是否它已經爲我做了這個組合。所以我不需要使用靜態列表。我無法找到有關的詳細信息。 – batmaci

+1

不,你不必檢查。這只是我展示獲取和插入。你可以在獲得之前插入。但通常使用GET,您仍然需要趕上KEyNotFoundException以防萬一。所以,如果你使用TPL,那麼你只需嘗試一下。如果你使用的是GetOrFetchObject,那麼它只是爲你做所有的魔術。請注意,我現在總是存在於緩存中,除非您設置了過期時間,否則不會進行提取。 –

相關問題