Android的Appout登出

时间:2012-08-19 21:19:54

标签: android sqlite

我正在使用内容提供者和共享首选项上的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);

但它似乎没有清除数据库,并且在注销后第一个事务中随机获得数据库访问错误..

这通常是如何完成的?

1 个答案:

答案 0 :(得分:5)

Google I/O 2012应用程序执行类似操作,因此您可能需要检查它。当用户logs out时,ContentResolver发出以下call

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开始的确切事件序列。