2014-02-18 66 views
14

我有一個應用程序使用SharedPreferences。一個只存儲應用程序版本以檢查更新日誌中的更新日誌,另一個包含clear()在用戶選擇時調用的一些佈局信息。我終於設法得到了一個PreferenceFragment工作,並注意到了一個趨勢,所以我想我可能會問,在我偏好瘋狂之前(儘管我認爲我已經夠了)。Android - 具有多個共享首選項是不好的做法嗎?

我已經盡力搜索並沒有看到具體提到的問題,只是可能有多個問題。

我有點擔心PreferenceManager.getDefaultSharedPreferences()抓錯了pref,但我可能只是誤解了用法。

唯一相關的代碼,我可以從我的活動想:

SharedPreferences storedVer = getSharedPreferences(VER_NUM, 0); 
SharedPreferences savedLayout = getSharedPreferences(LAYOUT_SAVE, 0); 
+5

每個命名sharedPreference創建一個新的XML文件,如果你認爲這是不是一個不好的做法可以幫助您保持數據更有條理,更容易找到。 –

+0

啊,謝謝你的確認。我應該關心'.getDefaultSharedPreferences()'返回什麼? – ziondreamt

回答

6

這根本不是壞習慣。我認爲這是相反的。我認爲不同的行爲應該使用不同的sharedPreference文件。

.getDefaultSharedPreferences()使用默認的com.company.packagename.xml文件。其他人創建自己的文件。

使用多個sharedPreference's的下列優點出現在我的腦海裏。

  • 當您使用BackupManager,可以提供sharedPreference文件備份和恢復。
  • 當用戶註銷,你可以刪除sharedPreference文件與它用戶私有值。你可能不想刪除其他的。
+0

感謝您對'.getDefaultSharedPreferences()'的解釋,我有點困惑當被調用時發生了什麼。 – ziondreamt

2

從我的經驗與SharedPreferences我注意到以下幾點:

1)始終使用盡量讓你SharedPreference名稱和屬性名稱在整個設備中都是唯一的。

2)請勿使用您的名稱SharedPreference,如「myPreference」,「preference」,「appPreference」等。使用您的PackageName作爲SharedPreference名稱的唯一標識符。

例子:

SharedPreferences preferences = getSharedPreferences(Context.getPackageName(), Context.MODE_PRIVATE); 

3)使用也爲你的屬性與包名串聯了屬性名稱的唯一鑰匙。

實施例:

Editor editor = sharedpreferences.edit(); 
boolean isAdminKey = Context.getPackageName()+"admin"; 
editor.putString(isAdminKey , "value"); 
editor.commit(); 

4)與一個commit()編輯多個鍵的值沒問題。

5)使用MODE_PRIVATE當您創建您的偏好,以防止其他應用程序讀取您的SharedPreferences。見第2步例如

6)不要依賴SharedPreferences 100%,因爲如果用戶從App信息屏幕按下按鈕,Clear Data將被清除。否則,在ExternalDirectory()中創建文件或將您的信息發送到服務器。

+2

我認爲直接在外部目錄中創建文件是不好的做法。當你這樣做的時候,你會集結用戶文件系統和SD卡。我有來自各種應用程序的數十個文件夾。我在外部文件系統中使用提供的位置。當用戶選擇清除數據時,它也會被刪除。 – tasomaniac

+2

此外,當用戶想要清除數據時,數據應該被清除。沒有必要阻止它。 – tasomaniac

+0

我不喜歡這樣,但很多着名的應用程序都像'watsapp'和'viber'那樣做。通過這種方式,您可以使數據遠離任何「清除數據」操作和「卸載」操作:) @tasomaniac –

0

遲到了,但我要說的不使用多個喜好。堅持與getDefaultSharedPreferences。我看到許多人未能跟蹤保存的偏好的名稱。一般而言,它會使代碼更加錯綜複雜(編譯器無法幫助您管理名稱)。此外,共享偏好適用於少數幾個小值 - 使用文件系統處理大事情,並使用數據庫處理大量數據。

我已經看到了一個名爲共享偏好使用了很多,我相信這是一個不幸的趨勢由copyPaste()傳播。

最後,您的偏好活動寫入默認共享偏好 - 我最近回答的問題在那裏,這是問題 - 如果將使用默認的喜好完全避免。請參閱:Android SharedPreferences not changing

你可能會考慮包裝的默認共享偏好的方法,使他們更更簡潔一些,因爲我已經做了here

+0

有趣的點,@Mr_and_Mrs_D。我可以看到最小化共享首選項的數量是否合理,只有在真正需要時才添加更多,但就像我說的其中一個首選項會根據用戶的選擇獲得一個「clear()」,而且我不會有知識還有更好的方法來做到這一點。因此,如果我使用這個pref來處理所有事情,我相信它會經常丟失它的內容。我已經考慮過文件系統和數據庫選項,但我認爲它只是在我的應用程序範圍之外(至少現在)。 – ziondreamt

+1

@ziondreamt:考慮[editor.remove( 「鑰匙」)](http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#remove(java.lang.String中)) –