Android : SharedPreferences 和 MVC 模式
Android : SharedPreferences and MVC pattern
我正在使用 MVC 模式开发我的应用程序。对于 store/access 数据,我的控制器使用名为 "DataStorage" 的 class,现在这个 class 允许 store/access 关于我的应用程序的简单参数(用户名,数据存储小路, ...)。换句话说,我想调用一些方法,例如 "getParameter(String key)" 或 "setParameter(String key, String value)"。
我认为 SharedPreferences 是存储这些参数最方便的方式,所以我的 get/setParameters 使用这个 class.
在我看到的所有示例中,SharedPreferences 都是从 Activity 调用的,调用 "getSharedPreferences" 或 "getApplicationContext"/"getContext" 等方法没有问题.因为我的 DataStorage class 不是 activity,现在我要求我的第一个 activity 在创建新的 DataStorage 实例时提供它的上下文,它可以很好地存储我的参数。我的问题:我希望能够使用 clear + commit 方法从另一个 activity 中删除参数。但它不起作用(参数仍然存在),我认为原因是我在创建另一个 DataStorage 实例时给出了第二个 activity 上下文。不过问题可能出在其他方面,我现在只练习了 Android 2 天...
总结一下我的应用程序的工作原理:
Activity 1 创建一个 DataStorage class 并将其上下文提供给 DataStorage 构造函数。 DataStorage 可能会将参数存储到 SharedPreferences 文件中(或不...)
当我再次 运行 我的应用程序时,如果在 SharedPreferences 文件中设置了特定参数,那么我将启动 Activity 2 而不是 Activity 1。使用 Activity 2 上的菜单,我希望能够清除 SharedPreferences 文件(以便在我重新启动应用程序时再次获得 Activity 1),因此我创建了另一个 DataStorage 实例(并且我提供Activity 2 context) 然后我调用该方法来清除所有参数。
正如我所说,第一部分运行良好(我可以存储参数),但清除和提交对我的 SharedPreferences 文件没有任何作用。
我不想在我的活动中直接为此添加一段代码。
你能帮我解决这个问题吗?我在使用 SharedPreferences 的方式上做错了什么?
感谢您的帮助!
编辑:
public class DataStorage {
private Context context;
private String settingsFilename;
private SharedPreferences settings;
public DataStorage(Context activityContext, String filename) {
context = activityContext;
settingsFilename = filename;
settings = context.getSharedPreferences(settingsFilename, Context.MODE_PRIVATE);
}
public void newSharedPreference(String key, String value) {
settings.edit().putString(key, value).apply();
settings.edit().commit();
}
public String getSharedPreference(String key) {
return settings.getString(key, null);
}
public void clearPreferences() {
settings.edit().clear();
settings.edit().commit();
Toast.makeText(context,settings.toString(), Toast.LENGTH_LONG).show();
}
}
我的第一个activity(代码是onCreate方法的一部分):
DataStorage storage = new DataStorage(this, getResources().getString(R.string.sharedPreferencesFile));
username = storage.getSharedPreference("username");
Toast.makeText(this, username, Toast.LENGTH_LONG).show();
if (username != null) {
Intent nextActivity = new Intent(this, ActivityMainMenu.class);
startActivity(nextActivity);
} else {
setContentView(R.layout.activity_name);
}
在我的第 2 个 activity 中:
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch(id) {
case R.id.action_clearSharedPref :
storage.clearPreferences();
break;
case R.id.action_leave :
System.exit(RESULT_OK);
}
return super.onOptionsItemSelected(item);
}
(存储构造与我在第一个 Activity 中所做的完全相同)
我尝试用 DataStorage 构造函数中的 getApplicationContext() 替换 "this",但没有成功。
来自 Editor Class 概述
Interface used for modifying values in a SharedPreferences object. All changes you make in an editor are batched, and not copied back to the original SharedPreferences
until you call commit()
or apply()
.
您需要更新以更改 DataStorage
中的方法
public void newSharedPreference(String key, String value) {
settings.edit().putString(key, value).apply();
}
和
public void clearPreferences() {
settings.edit().clear().apply();
Toast.makeText(context,settings.toString(), Toast.LENGTH_LONG).show();
}
下一个问题原因
settings.edit().clear(); // clear is ok, but it won't be saved because
settings.edit().commit(); // create new editor and commit nothing
我正在使用 MVC 模式开发我的应用程序。对于 store/access 数据,我的控制器使用名为 "DataStorage" 的 class,现在这个 class 允许 store/access 关于我的应用程序的简单参数(用户名,数据存储小路, ...)。换句话说,我想调用一些方法,例如 "getParameter(String key)" 或 "setParameter(String key, String value)"。 我认为 SharedPreferences 是存储这些参数最方便的方式,所以我的 get/setParameters 使用这个 class.
在我看到的所有示例中,SharedPreferences 都是从 Activity 调用的,调用 "getSharedPreferences" 或 "getApplicationContext"/"getContext" 等方法没有问题.因为我的 DataStorage class 不是 activity,现在我要求我的第一个 activity 在创建新的 DataStorage 实例时提供它的上下文,它可以很好地存储我的参数。我的问题:我希望能够使用 clear + commit 方法从另一个 activity 中删除参数。但它不起作用(参数仍然存在),我认为原因是我在创建另一个 DataStorage 实例时给出了第二个 activity 上下文。不过问题可能出在其他方面,我现在只练习了 Android 2 天...
总结一下我的应用程序的工作原理:
Activity 1 创建一个 DataStorage class 并将其上下文提供给 DataStorage 构造函数。 DataStorage 可能会将参数存储到 SharedPreferences 文件中(或不...)
当我再次 运行 我的应用程序时,如果在 SharedPreferences 文件中设置了特定参数,那么我将启动 Activity 2 而不是 Activity 1。使用 Activity 2 上的菜单,我希望能够清除 SharedPreferences 文件(以便在我重新启动应用程序时再次获得 Activity 1),因此我创建了另一个 DataStorage 实例(并且我提供Activity 2 context) 然后我调用该方法来清除所有参数。
正如我所说,第一部分运行良好(我可以存储参数),但清除和提交对我的 SharedPreferences 文件没有任何作用。 我不想在我的活动中直接为此添加一段代码。
你能帮我解决这个问题吗?我在使用 SharedPreferences 的方式上做错了什么?
感谢您的帮助!
编辑:
public class DataStorage {
private Context context;
private String settingsFilename;
private SharedPreferences settings;
public DataStorage(Context activityContext, String filename) {
context = activityContext;
settingsFilename = filename;
settings = context.getSharedPreferences(settingsFilename, Context.MODE_PRIVATE);
}
public void newSharedPreference(String key, String value) {
settings.edit().putString(key, value).apply();
settings.edit().commit();
}
public String getSharedPreference(String key) {
return settings.getString(key, null);
}
public void clearPreferences() {
settings.edit().clear();
settings.edit().commit();
Toast.makeText(context,settings.toString(), Toast.LENGTH_LONG).show();
}
}
我的第一个activity(代码是onCreate方法的一部分):
DataStorage storage = new DataStorage(this, getResources().getString(R.string.sharedPreferencesFile));
username = storage.getSharedPreference("username");
Toast.makeText(this, username, Toast.LENGTH_LONG).show();
if (username != null) {
Intent nextActivity = new Intent(this, ActivityMainMenu.class);
startActivity(nextActivity);
} else {
setContentView(R.layout.activity_name);
}
在我的第 2 个 activity 中:
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch(id) {
case R.id.action_clearSharedPref :
storage.clearPreferences();
break;
case R.id.action_leave :
System.exit(RESULT_OK);
}
return super.onOptionsItemSelected(item);
}
(存储构造与我在第一个 Activity 中所做的完全相同)
我尝试用 DataStorage 构造函数中的 getApplicationContext() 替换 "this",但没有成功。
来自 Editor Class 概述
Interface used for modifying values in a SharedPreferences object. All changes you make in an editor are batched, and not copied back to the original
SharedPreferences
until you callcommit()
orapply()
.
您需要更新以更改 DataStorage
public void newSharedPreference(String key, String value) {
settings.edit().putString(key, value).apply();
}
和
public void clearPreferences() {
settings.edit().clear().apply();
Toast.makeText(context,settings.toString(), Toast.LENGTH_LONG).show();
}
下一个问题原因
settings.edit().clear(); // clear is ok, but it won't be saved because
settings.edit().commit(); // create new editor and commit nothing