CALLER_IS_SYNCADAPTERは、データベース行に格納されている内容に必ずしも影響するわけではなく、実行されるコマンドによって異なります。クエリには影響しません。デバイス上のユーザーアプリケーションからは使用しないでください。
今...なぜそれが存在するのですか?
これは、notifyChange()/ ContentObservers / ContentResolver/Syncadapterの統合を支援するために提供されています。データベースの行を変更するための2つのユースケースがあります。
- ローカルユーザーがアプリケーションから編集します。
- 変更はネットワークから(SyncAdapterを介して)行われます
画面に表示されている場合は、どちらの変更でもUIを更新する必要があります。したがってContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork)
、呼び出されます。これにより、ContentObserversが更新され、ContentProviderDBから最新のデータをフェッチするように指示されます。呼び出しの最後のパラメーターが手がかりです。
ContentResolver自体はContentObserverです。データベースの変更を確認すると、SyncAdapterを起動して、変更をネットワークにプッシュすることを検討します。これは、ケース1の場合に最適です。ケース2の場合、冗長です。変更はネットワークからのものであり、変更を送り返すために同期を開始する理由はまったくありません。
Calendar.CALLER_IS_SYNCADAPTERは、SyncAdapterによって実行されるupdate()内で使用されるキューです。trueの場合、ContentProviderはsyncToNetwork
falseに設定され、冗長な2番目の同期が実行されないようにします
2番目の例はveljkoが述べたようです。サーバーからThingを削除する最もクリーンな方法は、削除フラグを設定してから同期を実行することです。CALLER_IS_SYNCADAPTERフラグがfalse(ユーザーアプリ)の場合、delete()を呼び出すとフラグが設定されます。フラグがtrueの場合(同期が発生している場合)、delete()を呼び出すと、削除がサーバーにプッシュされ、ローカルDBから行が削除されます。delete()呼び出しは1つだけです。このフラグを使用すると、ContentProviderは実行するタスクを知ることができます。