2017-01-30 12 views
0

xamarinフォームアプリケーションでプライマリローカルデータベースとして、または別のsqliteデータベースの上にキャッシュデータベースとしてakavacheを使用する必要がありますか?私はakavacheオブジェクトのデータを更新、挿入、削除する方法の例を見つけることができません。例えば、akavacheリストオブジェクトのアイテムを更新/挿入/削除する方法は?

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

は、私は、ローカルマシンに紺碧とストアからアイテムを取得していますし、これらの項目は編集/削除可能か、ユーザーが新しい項目を追加することができます。どうすればいいのですか?

+0

他を試しましたを挿入してメソッドを削除しますか? https://github.com/akavache/Akavache – Depechie

+0

@Depechieおそらく私は挿入の目的を理解していませんでしたが、これはakavacheキャッシュに完全な新しいオブジェクトを作成するのではなく、 BlobCache.UserAccount.InsertObject( "CacheItems"、新しい項目())を待ちます。これは、アイテムのリストとしてタイプを持つCacheItemsに新しいアイテム挿入を挿入します。 – batmaci

+0

私はGetOr ***メソッドはあなたのための基本呼び出しを行うだけのオーバーロードだと思った。同じキャッシュキーを使用する限り、必要なすべてのアイテムにアクセスできると思います。 – Depechie

答えて

1

LocalMachineに保存されたものは物理的にデバイスに永続化されます。だから、アプリやデバイス上で(ユーザーがアプリを削除またはあるデータをクリアしていない場合)、それはまだそこになります再起動する限り、ここで良いのサンプルをたくさん https://github.com/akavache/Akavache

があります保存/アクセスする方法として

オブジェクトの挿入やオブジェクトを取得し、あなたの基本的なアクセス方法であり、その後、非常に便利ですGetOrFetch、GetAndFetchのような拡張メソッドの多く、

がありますここで私はスーパーのものにアクセスする1つの方法を与えることをテストしていない迅速なサンプルです。おそらく拡張メソッドのいくつかを使う方が良いでしょうが、私はこのような例が概念的に有用であると考えています。

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を起動したときのほとんどの場合、 VMまたはサービスクラスの中にいくつかのプロパティとして格納するだけです。すべての変更がオブジェクトに行われたとき、私はちょうど私がアプリはダウン閉じた場合、ユーザーがアプリを起動する右のときに私は、そのオブジェクトの最新バージョンを持っています今知っているその時点でキャッシュ

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

に挿入します私が与えた

例はあなたがあなたの元の質問を持っていることは正常に動作します...アクセスの完全な受信の方法より多くのです、それはそれが行くその後、存在しない場合は、基本的にキャッシュをチェックします

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

アズールに...

LocalMachineは物理デバイスに格納します.Imemoryは、アプリケーションがメモリからアンロードされると消え去る内部辞書に格納し、UserAccountはNTリモート処理アカウントで動作します。

+0

本当にそれが存在するかどうかをチェックする必要がありますか?挿入すると、存在しない場合は挿入を処理し、存在する場合は更新します。 btw、どうしてサブスクリプションサフィックスを追加するのですか?それにはどんな良い理由がありますか? – batmaci

+0

基本的に私はちょうど同様のロジックを実装しました。私は静的リストを使用してアプリケーションを使用している間、メモリを保持しています。毎回アプリケーションが再初期化されます。それが私のためにこの組み合わせを既に行っているかどうか私はInMemoryオプションについて興味があったのです。だから私は静的リストを使う必要はありません。私は詳細な情報を見つけることができませんでした。 – batmaci

+1

いいえ、あなたは確認する必要はありません。それはちょうど私が手に入れて挿入することを示していた。これまでに挿入するだけで済みます。しかし、通常はGETを使用すると、場合によってはKEyNotFoundExceptionをキャッチすることになります。 TPLを使用している場合は、getをキャッチしてみてください。 GetOrFetchObjectを使用している場合は、それだけであなたのためのすべての魔法を行います。ちょうど私が今キャッシュに存在し、それに期限を設定しなければフェッチしないことに気をつけてください。 –

関連する問題