2013-03-18 60 views
1

當我最初撰寫出版了我的應用程序,我使用的是自定義編寫的活動來處理應用程序設置。我使用的自定義文件名存儲共享preferfences,像這樣:遷移從getSharedPreferences(自定義文件)getDefaultSharedPreferences()

getSharedPreferences("custom_settings_file",MODE_PRIVATE); 

但現在我重構我的應用程序,我想實現PreferenceActivityPreferenceFragmentPreferenceScreen部分的XML文件。每次我見過的教程或例子是使用

getDefaultSharedPreferences(context); 

檢索共享偏好,因爲PreferenceActivity假設默認文件名存儲的偏好,有沒有辦法告訴它使用一個不同的(至少我做不到找一個小時後搜索並閱讀文檔)。

所以現在我有一個問題。如果我只是簡單地使用新的默認文件,我的應用程序的現有用戶在更新應用程序時將失去它們的設置,因爲新應用程序不會知道任何關於「custom_settings_file」的信息。在應用更新中將數據從舊文件移動到新文件的最佳方式是什麼?

這裏是我能想出可能的選項:

  • 擴展Application類和實施的onCreate()的一段代碼讓每一個我的應用程序啓動時,它會檢查是否存在「custom_settings_file」並將其內容移至新的內容。但是,在每次啓動應用程序時運行代碼塊似乎都浪費了太多處理資源,只能運行一次。
  • 只需通知用戶其舊設置已消失。但顯然這是不可接受的。

是否有更好的解決方案,比選1?也許有人已經面臨類似的問題?

回答

2

什麼在阻止你做1號只有一次? 只需將「遷移」布爾值添加到新的sharedpreferences即可。

+0

這是一個優雅的解決方案!謝謝。 – 2013-03-18 01:06:43

1

你能在你的新SharedPreferences增加價值,它記錄你是否是一個新的安裝或升級。如果您的共享首選項中沒有該設置,請檢查您是否擁有舊的首選項文件。然後將這些首選項轉換爲新的方法,並將您的私有設置設置爲已升級。然後,只需設置指示新狀態的新值,就不再需要檢查舊的首選項。

2

如果您還加載XML預置文件,那麼你可以試試這個:

PreferenceManager.setDefaultValues(context, YOUR_PREFERENCE_NAME, MODE_PRIVATE, R.xml.preference_file, false); 

如果不是(你想在你的代碼中動態添加的每個首選項),那麼你可以這樣做:

PreferenceManager pm = getPreferenceManager(); 
pm.setSharedPreferencesMode(MODE_PRIVATE); 
pm.setSharedPreferencesName(YOUR_PREFERENCE_NAME); 

如果你仍然想使用defaultSharedPreference和處理遷移然後......我寫這篇文章,我看到尼克拉斯的答案,所以我所做的一切。

相關問題