1

我正在使用 contentprovider,以及共享首选项上的 3 个变量,我想知道如何最好地“注销用户”..

我希望它会截断数据库,并清除/删除共享首选项变量..

目前我正在清除共享首选项,并删除数据库,然后将用户带回登录屏幕。

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的删除方法:

@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 回答