2011-03-26 60 views
0

如果我使用registerDefaults在默認值中構建了一個包含2個字符串的1.0應用程序,則使用
而在2.0版本中,我決定刪除第一個舊字符串,並將第二個字符串(更改其關鍵字符串)移動到一個新的第三個字符串中。
我該如何處理這個問題,以及如何處理可能通過版本對內容進行的更改。
iPhone - 從舊的應用程序偏好升級

1.0偏好設置應

StringKey someValue 
DateKey  10/10/2010 

1.1偏好設置應

StringKey someValue 
DateKey  2010/10/10 

2.0偏好設置應

Array 
    Item0 is DateKey  10/10/2010 
    Item1 is BadString  BadBadValue 

回答

1

如果您在應用的1.0版本中使用registerDefaults:,那很簡單。當你停下來註冊這些舊值時,它們不會被用戶更改,它們會從NSUserDefaults中消失。

因此,請求NSUserDefaults所有應該轉換的對象。如果存在,則將它們轉換爲新格式,將它們保存在NSUserDefaults中並刪除舊值。

像這樣的東西應該工作

// check if you can get the old object. if it's there it was changed by the user 
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"OldKey1"]) { 
    // old key is present 
    id oldObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"OldKey1"]; 

    id newObject = ... // convert the old object to the new object 
    [[NSUserDefaults standardUserDefaults] setObject:newObject forKey:@"NewKey1"]; 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"OldKey1"]; 
} 
else { 
    // old key not there, do nothing 
} 

// register your new defaults... 

如果你還沒有使用registerDefaults:你現在有一個問題。因爲您不知道用戶是否更改了該對象,或者該對象只是您的默認對象。而且您不能認爲該值仍然處於默認狀態,只是因爲它具有與默認值相同的值。

但在這種情況下該怎麼辦?我可能會重置爲默認值,並顯示一個UIAlert,告訴用戶檢查首選項,因爲我犯了一個錯誤:-)

+0

@fluchtpunkt:太好了。這就是我開始編寫代碼的方式。但你如何處理prefs版本。我計劃在plist中加入prefs版本。因爲當你使用8.5版本的時候,你必須知道你正在閱讀的是哪個版本的prefs,以便知道要調用哪些鍵以及如何解釋它們的內容。因爲您可以在1.0版本中使用KeyCodeAAA,該版本不包含與3.2版本中使用的KeyCodeAAA相同的內容或格式(請參閱我對日期的編輯(可能是其他任何內容))讓我們假設用戶更改了日期,你正在運行一個2.0應用程序)。 – Oliver 2011-03-26 15:52:45

+0

當然,將該版本添加到首選項。這是您不能使用registerDefaults的少數例外之一。哦,如果你想保存日期,你應該保存NSDate對象。 – 2011-03-26 15:59:08

+0

@fluchtpunkt:如何處理舊密鑰與新的默認密鑰衝突,這些密鑰沒有相同的內容或格式?您可以在啓動時使用默認值初始化它們,但是當您想知道是否存在舊值時,只需覆蓋當前值(如果存在)。但是你不知道objectForKey的返回值是舊的還是新的,或者你必須用新的值來測試所有的值,看看它們是否不同......你如何處理這個? – Oliver 2011-03-26 16:06:57

相關問題