【问题标题】:iPhone - upgrading from old app preferencesiPhone - 从旧的应用偏好升级
【发布时间】:2011-03-26 15:21:05
【问题描述】:

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

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

【问题讨论】:

    标签: iphone plist upgrade nsuserdefaults defaults


    【解决方案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 告诉用户检查首选项,因为我犯了一个错误:-)

    【讨论】:

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