1

私はcontentproviderを使用しており、共有設定で3つの変数を使用していますが、「ユーザーをログアウトする」のに最適な方法を考えています。

dbを切り捨て、共有設定変数をクリア/削除することを期待します。

現在、共有設定をクリアし、データベースを削除してから、ユーザーをログイン画面に戻しています。

SharedPreferences app_preferences = PreferenceManager
        .getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = app_preferences.edit();

// wipe user specific data
editor.remove("authenticated_user_id");
editor.remove("api_key");
editor.remove("last_sync_updates");

editor.commit();

// TODO possibly truncate rather than delete
// the apps database
getApplicationContext().deleteDatabase(
        DatabaseConstants.DATABASE_NAME);

// send the user to the login screen
Intent logoutIntent = new Intent(this, SplashActivity.class);
startActivity(logoutIntent);

しかし、データベースがクリアされていないようで、ログアウト後の最初のトランザクションでデータベースアクセスエラーがランダムに発生します。

これは通常どのように行われますか?

4

1 に答える 1

5

Google I / O 2012アプリケーションは同様のことを行うので、それを確認することをお勧めします。ユーザーがログアウトすると、次の呼び出しContentResolver行われます。

getContentResolver().delete(ScheduleContract.BASE_CONTENT_URI, null, null);

ScheduleProviderこれにより、のdeleteメソッドが呼び出されます。

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    if (uri == ScheduleContract.BASE_CONTENT_URI) {
        // Handle whole database deletes (e.g. when signing out)
        deleteDatabase();
        getContext().getContentResolver().notifyChange(uri, null, false);
        return 1;
    }

    /* ... */
}

deleteDatabase()次のプライベートヘルパーメソッドはどこにありますか。

private void deleteDatabase() {
    mOpenHelper.close();
    Context context = getContext();
    context.deleteDatabase(ScheduleContract.DATABASE_NAME);
    mOpenHelper = new ScheduleDatabase(context);
}

で始まるイベントの正確なシーケンスを確認できますScheduleProvider.java

于 2012-08-19T21:39:07.160 に答える