如何防止新版本中的核心数据问题

时间:2014-10-06 07:07:31

标签: ios iphone xcode core-data app-store

  

忘了    进行核心数据迁移

在提交我的应用程序的新版本之前。安装旧版本并更新到新版本时,启动时,应用程序会崩溃。

删除新版本并重新安装应用时,一切正常。我们正在App Store上讨论prod版本。

你能告诉我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您可以提交执行数据迁移的版本。

  • 假设用户拥有版本1.0
  • Buggy version 1.1
  • 现在你发布了一个好的版本1.2。

如果用户从1.0更新 - > 1.2它应该工作。 如果用户已经更新到1.1(确实崩溃),那么应用程序无法更改数据,因此如果他们从1.1更新了应该没问题 - > 1.2(但无论如何,如果我是对的,请尝试自己)

最坏情况: 我不知道你在核心数据中有什么样的数据,但如果它是可重构的,你可以删除旧数据并创建一个新数据。

答案 1 :(得分:1)

您必须进行轻量级迁移: -

制作两个版本的Datamodel [安全]

这样的事情: -

+ (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if ([DBHelper sharedCoreDataInstance].objPersistentStoreCoordinator != nil) {
        return [DBHelper sharedCoreDataInstance].objPersistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationLibraryDirectory] URLByAppendingPathComponent:@"yourdb.sqlite"];

    NSError *error = nil;

    NSDictionary *options = @{
                              NSMigratePersistentStoresAutomaticallyOption : @YES,
                              NSInferMappingModelAutomaticallyOption : @YES
                              };

    [DBHelper sharedCoreDataInstance].objPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                                                                       initWithManagedObjectModel:[self managedObjectModel]];

    if(![[DBHelper sharedCoreDataInstance].objPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                                                      configuration:nil
                                                                                                URL:storeURL
                                                                                            options:options
                                                                                              error:&error])
    {
        //Error for store creation should be handled in here
    }

    return [DBHelper sharedCoreDataInstance].objPersistentStoreCoordinator;
}