2011-03-26 31 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

相关问题