我正在使用MVC模式開發我的應用程序。爲了存儲/訪問數據,我的控制器使用名爲「DataStorage」的類,目前該類允許存儲/訪問有關我的應用(用戶名,數據存儲路徑等)的簡單參數。換句話說,我想調用一些方法,如「getParameter(String key)」或「setParameter(String key,String value)」。 我認爲SharedPreferences是存儲這些參數最方便的方法,所以我的get/setParameters使用這個類。Android:SharedPreferences和MVC模式
在我看到的所有例子中,SharedPreferences是從一個Activity調用的,調用諸如「getSharedPreferences」或「getApplicationContext」/「getContext」之類的方法沒有問題。因爲我的DataStorage類不是一個活動,所以現在我要求我的第一個活動在創建新的DataStorage實例時給出它的上下文,並且它可以很好地存儲我的參數。我的問題:我希望能夠使用clear + commit方法從其他活動中移除參數。但它不起作用(參數仍然存在),我認爲原因是我在創建DataStorage的另一個實例時給出了第二個活動上下文。這個問題可能是別的東西,雖然,我一直在練習的Android現在只有2天...
總結我的應用程序是如何工作的:
活動1創建的數據存儲類,並提供其上下文到DataStorage構造函數。 DataStorage可能會將參數存儲到SharedPreferences文件中(或者不存在...)
當我再次運行我的應用程序時,如果SharedPreferences文件中設置了特定參數,那麼我將啓動Activity 2而不是Activity 1。使用Activity 2上的菜單,我希望能夠清除SharedPreferences文件(爲了在重新啓動應用程序時再次獲取Activity 1),所以我創建了另一個DataStorage實例(並且我提供了Activity 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();
}
}
在我的第一活動(代碼是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);
}
以我第二活動:
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);
}
(存儲正在構建的就像我在第一次活動中那樣)
我試圖通過DataStorage構造函數中的getApplicationContext()來替換「this」,但它不起作用。
請提供DataStorage'的'全碼及其在活動中的用法。 – gio 2015-01-15 17:16:48
完成。告訴我你是否需要更多信息 – Carrm 2015-01-15 18:24:01
你的'DataStorage'類不能擴展'Activity'嗎? – natario 2015-01-15 18:30:45