iPhone-从旧应用程序首选项升级

iPhone-从旧应用程序首选项升级,iphone,plist,upgrade,nsuserdefaults,defaults,Iphone,Plist,Upgrade,Nsuserdefaults,Defaults,如果我使用registerDefaults构建默认值为2个字符串的1.0应用程序 在2.0版本中,我决定删除第一个旧字符串,并将第二个字符串(更改其键字符串)与新的第三个字符串一起移动到数组中。 我可以如何处理这个问题,以及如何处理可能通过版本对内容进行的更改 1.0首选项应为 StringKey someValue DateKey 10/10/2010 StringKey someValue DateKey 2010/10/10 Array

如果我使用registerDefaults构建默认值为2个字符串的1.0应用程序
在2.0版本中,我决定删除第一个旧字符串,并将第二个字符串(更改其键字符串)与新的第三个字符串一起移动到数组中。
我可以如何处理这个问题,以及如何处理可能通过版本对内容进行的更改

1.0首选项应为

StringKey    someValue  
DateKey      10/10/2010
StringKey    someValue  
DateKey      2010/10/10
Array  
    Item0 is    DateKey        10/10/2010  
    Item1 is    BadString      BadBadValue
1.1首选项应为

StringKey    someValue  
DateKey      10/10/2010
StringKey    someValue  
DateKey      2010/10/10
Array  
    Item0 is    DateKey        10/10/2010  
    Item1 is    BadString      BadBadValue
2.0首选项应为

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

如果您在应用程序的1.0版中使用了
registerDefaults:
,那么就很容易了。当您停止注册这些旧值并且用户未更改它们时,它们将从NSUserDefault中消失

因此,为所有应转换的对象询问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...
如果您没有使用
注册表默认值:
您现在有问题了。因为您不知道该对象是否由用户更改,或者该对象是否只是您的默认对象。您不能仅仅因为该值与默认值相同就假定该值仍处于默认状态


但在这种情况下该怎么办呢?我可能会将该值重置为默认值,并显示一个UIAlert,告诉用户检查首选项,因为我犯了一个错误:-)

@fluchtpunkt:Great。这就是我开始编写代码的方式。但是如何处理prefs版本呢。我计划在plist中添加prefs版本。因为当您使用8.5版本时,您必须知道您正在阅读哪个版本的prefs,才能知道调用哪个键以及如何解释它们的内容。因为你可以在1.0版本中使用KeyCodeAAA,它不包含与3.2版本中使用的KeyCodeAAA相同的内容或格式(请参阅我对日期的编辑(可以是任何其他内容)。让我们假设用户更改了日期,而你正在运行2.0应用程序)。当然,将版本添加到首选项中。这是少数不能使用registerDefaults的例外情况之一。哦,如果你想保存日期,你可能应该保存NSDate对象。@fluchtpunkt:如何处理旧的键与新的默认键冲突,这些默认键的内容或格式都不相同?您可以在开始时使用默认值初始化它们,但当您想知道是否存在旧值时,只需覆盖当前值(如果存在)。但是您无法知道objectForKey返回的值是旧值还是新值,或者您必须使用新值测试所有值以查看它们是否不同。。。你是怎么处理的?你是对的。您应该在注册新的默认值之前进行升级。@fluchtpunkt:是的,但是现在这样做,新的默认值将覆盖您刚才加载的旧默认值。如果从主捆绑包中包含的plist文件初始化新的默认值,则必须首先初始化。这样做,您必须在注册默认值之前测试所有现有值,所以我想问一下这些默认值的有用性。不是吗?