私は解決策は、アプリケーションのContentProvider
はOnAccountsUpdateListener
を実装することです発見しました。 account_manager.addOnAccountsUpdatedListener(this, null, false)
とそのonCreate
方法でリスナーとしてContentProvider
を取り付けた後、私はそのString
でSQLクエリを構築し、その後、現在接続しているアカウントのString
を構築
@Override
public void onAccountsUpdated(final Account[] accounts) {
Ln.i("Accounts updated.");
final Iterable<String> account_list = new Iterable<String>() {
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private final Iterator<Account> account_list = Arrays.asList(accounts).iterator();
@Override
public boolean hasNext() {
return account_list.hasNext();
}
/** Extracts the next account name and wraps it in single quotes. */
@Override
public String next() {
return "'" + account_list.next().name + "'";
}
@Override
public void remove() { throw new UnsupportedOperationException("Not implemented"); }
};
}
};
final String account_set = TextUtils.join(", ", account_list);
Ln.i("Current accounts: %s", account_set);
// Removes content that is associated with accounts that are not currently connected
final SelectionBuilder builder = new SelectionBuilder();
builder.table(Tables.CALENDARS)
.where(Calendars.CALENDAR_USER + " NOT IN (?)", account_set);
new SafeAsyncTask() {
@Override
public Void call() throws Exception {
_model.openWritableDatabase();
_model.delete(builder);
return null;
}
}.execute();
getContext().getContentResolver().notifyChange(Calendars.NO_SYNC_URI, null, false);
}
のようなインターフェイスメソッドを実装します。私は、現在の接続されていないアカウントに関連付けられているデータを削除するために、そのクエリのバックグラウンドスレッドでデータベースの削除を実行します。そして、私はコンテンツが変更されたことを通知しますが、サーバーと同期する必要はありません。
あなたはあなたの答えに少し詳しく説明してもらえますか?あなたは「onCreate」と何を話していますか? – akirk
... ContentProviderは、最初の行を近くに読みます。あなたがもっと精巧にしたいものが何であるか分かりませんd –
ContentProvidersライフサイクルの関連ポイントでOnAccountsUpdateListenerを削除できますか? – fr1550n