2015-01-15 77 views
1

我正在使用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」,但它不起作用。

+0

請提供DataStorage'的'全碼及其在活動中的用法。 – gio 2015-01-15 17:16:48

+0

完成。告訴我你是否需要更多信息 – Carrm 2015-01-15 18:24:01

+0

你的'DataStorage'類不能擴展'Activity'嗎? – natario 2015-01-15 18:30:45

回答

0

Editor從類概述

接口用於在SharedPreferences對象修改值。在編輯器中進行的所有更改都會批處理,並且不會複製回原始的SharedPreferences,除非您致電commit()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 
+0

它的工作原理。謝謝,我不明白我真的沒有在編輯上工作。 – Carrm 2015-01-15 21:01:36

+0

您創建編輯器清除它,但**沒有**應用更改。 – gio 2015-01-15 21:22:34