2016-07-02 13 views
1

レルムをXamarinアプリで使用していて、リモートソースに基づいてローカルデータベースをリフレッシュする際に問題があります。データは、リモートエンドポイントからフェッチされ、Realmを使用してローカルに格納され、より簡単に、より高速にアクセスできます。次のようにレルムの書き込みが完了するまで待つ

プログラムフローは、(可能であれば)

  1. は、リモート・ソースからデータをフェッチします。
  2. これまでに見たIDを追跡しながら、リモートソースから返されたエンティティをループします。新しいエンティティまたは更新されたエンティティがレルムに書き込まれます。ローカルに保存されているエンティティのセットを通して
  3. ループ、(トランザクションで)私たちはRealm.Remove(entity);とステップ2で見ていないエンティティを削除
  4. 戻り残念ながら、実体が前にステップ4で返されRealm.All<Entity>();

すべての「削除」操作が書き込まれています。その結果、ローカルデータベースが完全に同期する前に、いくつかのリフレッシュが必要になります。次のように

削除操作が行われます。

foreach (Entity entity in realm.All<Entity>()) 
{ 
    if (seenIds.Contains(entity.Id)) 
    { 
     continue; 
    } 

    realm.Write(() => { 
     realm.Remove(entity); 
    }); 
} 

は、トランザクションが完了するまでRealm.All<Entity>();を返す前に、レルム待ちを持ってする方法はありますか?

+0

あなたは私を見ることができますか? – jzeferino

+0

もちろん、最初の投稿に追加しました。 – vicdelfant

答えて

0

これは特にRealmの問題ではないと確信しています。同じパターンは、多くの列挙可能な変更可能なコンテナで問題を引き起こします。列挙を繰り返す間にリストからアイテムを削除しているので、列挙があまりにも遠くに移動しています。レルム取引にはバッファリングはありません

ので、私はそれがである保証するものではありませについて取引までのレルムの待ち時間がを完了したが、あなたのリストのロジックです持っています。

異なり、これを行うには、2つの基本的な方法があります。

  1. 使用ToListAllからすべてのオブジェクトのリストを取得するには - これは多くのオブジェクト場合は、すべてのオブジェクトをインスタンス化しますので、高価ですが。
  2. ループ内のオブジェクトを削除する代わりに、削除するアイテムのリストにを追加してください。その後、そのリストを繰り返します。

ここでWriteを使用しているように、トランザクションごとの削除は比較的遅いことに注意してください。 1つのトランザクションで多くの操作を実行できます。

また、これを処理するためのより効率的な方法を提供する可能性のあるRealm APIのその他の改良に取り組んでいます。相対データサイズ(ループ内のレコード数とレコード数)を知ることは非常に役に立ちます。私たちはの愛サンプルデータとスキーマを取得しています(私的に[email protected]に送ることができます)。

オプション2の例:your'eがremove取引を行う方法

var toDelete = new List<Entity>(); 
foreach (Entity entity in realm.All<Entity>()) 
{ 
    if (!seenIds.Contains(entity.Id)) 
     toDelete.Add(entity); 
} 
realm.Write(() => { 
    foreach (Entity entity in toDelete)) 
     realm.Remove(entity); 
}); 
+1

ありがとう!あなたは完全に正しいです、問題は本当に 'foreach'内の' realm.Remove() 'によって引き起こされ、Realmに実際には関係しませんでした。ときどき最も簡単なことは間違いなく簡単です:)参考のために、私はあなたにデータセットのサンプルを電子メールでお送りします。 – vicdelfant

関連する問題