2013-05-06 82 views
2

我有一個應用程序在那裏我存儲這樣的用戶偏好:如何將Android偏好設置遷移到新版本?

public static final String KEY_PREFS_LOGIN_INFO = "login_info"; 
public static final String KEY_PREFS_FILE_VERSIONs = "file_versions"; 
public static final String KEY_PREFS_LOGS = "logs"; 
public static final String KEY_PREFS_OTHERS = "others"; 

隨着PREF,具體方法是這樣的:

public static void setFileVersion(String key) { 
    SharedPreferences settings = getAppContext().getSharedPreferences(KEY_PREFS_FILE_VERSIONS, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("current", key); 
    editor.commit(); 
} 

,然後檢索這樣的價值觀:

public static String filesVersion() { 
    SharedPreferences settings = getAppContext().getSharedPreferences(KEY_PREFS_FILE_VERSIONS, 0); 
    String current = settings.getString("current", ""); 
    return current; 
} 

我想要做的是將我的所有偏好存儲在一個位置,以便我可以使用通用方法訪問它們中的任何一個。我如何設置一種方法來在升級時將舊存儲位置的值遷移到新的位置?我正在尋找類似於SQLiteOpenHelper中onUpgrade()方法的東西。

回答

3

我會覆蓋應用程序。然後在啓動時檢查共享首選項中存儲的版本號,然後根據需要執行從舊密鑰到新密鑰的遍歷。

public class MyApplication extends Application { 
    private static final int CURRENT_PREFS_VERSION = 2; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     if(filesVersion() != CURRENT_PREFS_VERSION){ 
      migrate(filesVersion()) 
     } 
    } 

    private migrate(int oldVersion){ 

     switch(oldVersion){ 
      case 1: 
       //get old preference, store new preference 
       break; 
     } 

     setFileVersion(CURRENT_PREFS_VERSION) 
    } 
+0

所以我猜這意味着我必須保持舊的偏好名稱,基本上永遠?但是,也許我應該刪除最後的變量,然後直接放入字符串。你怎麼看? – Cornholio 2013-05-06 11:51:02

+1

爲了支持從舊版本的應用程序遷移,您必須保留舊名稱放在某個地方。但是,將acccess集中到偏好的想法仍然是一個公平的想法,我已經在我發佈的應用中使用過這個想法。 – 2013-05-06 11:53:37

+0

好的,有道理 - 但我還有其他一些問題,但是 - 如果我沒有存儲過舊版本,我怎麼能得到舊的prefs版本?我是否應該爲此版本假設(當然是正確的)我必須升級並且稍後添加一個if子句來檢查版本? – Cornholio 2013-05-06 12:00:11