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 天...

总结一下我的应用程序的工作原理:

正如我所说,第一部分运行良好(我可以存储参数),但清除和提交对我的 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