3

どういうわけか、クエリ パラメータ CALLER_IS_SYNCADAPTER の動作概念がわかりません。デフォルト値は false です。設定されている場合、DIRTY フラグは自動的に設定されません。では、それは実際にはどういう意味ですか?私の理解では、連絡先を変更するたびにダーティ フラグが 1 に設定されます。同期アダプタがジョブを終了した後、CALLER_IS_SYNCADAPTER で挿入/更新/削除を使用すると、挿入/更新および削除されたレコードのダーティ フラグは 0 になります。 、そうですか。

ただし、そのオプションのパラメーターを使用してクエリを呼び出すと、エントリはフラグ 1 のままになります。

私がしなければならないことは他にありますか、またはそれがどのように機能するかについての私の理解は間違っていますか? または、フラグを設定するために同期が正常に終了したことをシステムに伝える何かがありますか?

さらに読むためのサンプルやアドバイスはありますか?

4

3 に答える 3

7

CALLER_IS_SYNCADAPTERは、データベース行に格納されている内容に必ずしも影響するわけではなく、実行されるコマンドによって異なります。クエリには影響しません。デバイス上のユーザーアプリケーションからは使用しないでください。

今...なぜそれが存在するのですか?

これは、notifyChange()/ ContentObservers / ContentResolver/Syncadapterの統合を支援するために提供されています。データベースの行を変更するための2つのユースケースがあります。

  1. ローカルユーザーがアプリケーションから編集します。
  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はsyncToNetworkfalseに設定され、冗長な2番目の同期が実行されないようにします

2番目の例はveljkoが述べたようです。サーバーからThingを削除する最もクリーンな方法は、削除フラグを設定してから同期を実行することです。CALLER_IS_SYNCADAPTERフラグがfalse(ユーザーアプリ)の場合、delete()を呼び出すとフラグが設定されます。フラグがtrueの場合(同期が発生している場合)、delete()を呼び出すと、削除がサーバーにプッシュされ、ローカルDBから行が削除されます。delete()呼び出しは1つだけです。このフラグを使用すると、ContentProviderは実行するタスクを知ることができます。

于 2011-12-01T15:04:16.180 に答える
4

既存の Uri に追加できます。

myUri=calendarUri.buildUpon().appendQueryParameter(Calendar.CALLER_IS_SYNCADAPTER, "true").build();
于 2011-08-23T14:26:38.790 に答える
-1

これはJavadocからのものです:

/** * オプションの挿入、更新、または削除 URI パラメータで、呼び出し元が * 同期アダプタであることを指定できるようにします。デフォルト値は false です。true の場合 * ダーティ フラグは自動的に設定されず、* {@link ContentResolver#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)} を呼び出したときに「syncToNetwork」パラメーターは * false に設定されます。*/

.

resolver.delete(...) を呼び出しても、未加工の連絡先行はすぐには削除されません。代わりに、未加工の連絡先に DELETED フラグを設定し、集約された連絡先から未加工の連絡先を削除します。次に、同期アダプターはサーバーから raw 連絡先を削除し、resolver.delete(...) を再度呼び出して CALLER_IS_SYNCADAPTER クエリ パラメーターを渡すことにより、電話側の削除を完了します。

于 2011-08-24T07:15:14.363 に答える