解決策は、アプリのContentProvider
実装を作成することであることがわかりOnAccountsUpdateListener
ました。をそのメソッドにContentProvider
リスナーとしてアタッチしてから、次のようなインターフェイスメソッドを実装します。onCreate
account_manager.addOnAccountsUpdatedListener(this, null, false)
@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);
}
現在接続されているアカウントを作成String
し、それを使用してSQLクエリを作成しますString
。そのクエリのバックグラウンドスレッドでデータベースの削除を実行して、現在接続されていないアカウントに関連付けられているデータを削除します。また、コンテンツが変更されたことを通知しますが、サーバーと同期する必要はありません。