我正在使用内容提供者和共享首选项上的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);
但它似乎没有清除数据库,并且在注销后第一个事务中随机获得数据库访问错误..
这通常是如何完成的?
答案 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
开始的确切事件序列。