2017-06-01 1 views
1

realm.create()を呼び出して既に存在するエントリのプライマリキーを渡すと、私はそれが挿入とは対照的に更新を行うことを理解しています。レルムの同期は、変更されていないデータによってどのように影響を受けますか?

realmサーバーを使用していて、既存のエントリでrealm.create()を呼び出し、既にその行にあったすべてのフィールドを同じデータで更新する場合、他のクライアントは同期する必要があるでしょうかその行を変更したり、変更されたデータがないので、無視することを知っていますか?

前回と現在のデータを比較するか、エントリが最後に編集されたときに基づいてメタデータに基づいて行に同期化フラグが生成されますか?

データが変更されなくても何千もの既存の行でrealm.create()を呼び出す可能性があるため、他のクライアントに大きな同期を行わせたくない結果として。

答えて

2

レルムの同期は、状態ではなく実際のデータベース操作に基づいています。より具体的には、データベースはトランザクションまたは動作ログを維持し、データ同期はこのデータの送信に基づいている。たとえば、のアップサート操作であるrealm.create('Object', {foo:bar, id: 0}, true)id:0と実行すると、これはログに書き込まれ、同期されます。

upsertがデータを変更しない場合でも、操作は引き続き同期されなければなりません。この理由は、同期が操作変換アルゴリズムを使用して、デバイス間のすべての変更が最終的に一貫していることを自動的に保証するということです。これは、最終的にサーバーがすべての操作を受け取れるようにすることによって機能します。

可能な場合は、不要な操作に注意する必要があります。同期は高度に最適化されています。同期操作だけでは、各変更時にオブジェクト全体が再送信されるのに比べてデータ転送が減少します。

長期的には、サーバー上のログ圧縮のサポートを追加します。これは、クライアントが常に操作をサーバーに送信する必要があることを意味しますが、サーバーは他のクライアントを収束させるために必要な操作を減らす可能性があります(たとえば、複数の設定操作を最終セットに縮小するなど)。

関連する問題