在迁移时从 iCloud 迁移到本地商店崩溃的应用程序“对象不能为零” - 使用 Core Data

Posted

技术标签:

【中文标题】在迁移时从 iCloud 迁移到本地商店崩溃的应用程序“对象不能为零” - 使用 Core Data【英文标题】:Migrating from iCloud to Local store crashing app with "Object cannot be nil" at the migration - with the use of Core Data 【发布时间】:2014-08-26 15:35:17 【问题描述】:

我有一个仅限 ios 7 的应用程序,它使用 Core Data 进行存储,我带来了 iCloud,并切换到该应用程序。

iCloud 集成的各个方面都在工作,除了用户在应用内关闭 iCloud 时从 iCloud 商店迁移到本地商店。

通过使用Exception Breakpoint,应用程序崩溃了:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM replaceObjectAtIndex:withObject:]: object cannot be nil'

这在“migratePersistentStore”代码处崩溃。

这是执行此操作的代码:

- (void)migrateiCloudStoreToTheLocalStoreAfterUserTurnedOffiCloudInSettings
    
    // So we can see what's going on, we'll write out the current store URL before the migration
    NSURL *storeURL = [self.persistentStoreCoordinator.persistentStores.lastObject URL];
    NSLog(@"Current Store URL (before iCloud to Local migration): %@", [storeURL description]);

    //    NSPersistentStore *currentStore =     self.persistentStoreCoordinator.persistentStores.lastObject;

    NSPersistentStore *currentStore = [[self.persistentStoreCoordinator persistentStores] firstObject];
    // We'll create a new URL
    NSURL *localURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Envylope.sqlite"];

    NSDictionary *localStoreOptions = nil;
    localStoreOptions = @ NSPersistentStoreRemoveUbiquitousMetadataOption : @YES,
                           NSMigratePersistentStoresAutomaticallyOption : @YES,
                           NSInferMappingModelAutomaticallyOption : @YES;

    NSError *error = nil;
    [self.persistentStoreCoordinator migratePersistentStore:currentStore
                                                      toURL:localURL
                                                    options:localStoreOptions
                                                   withType:NSSQLiteStoreType error:&error];

    NSLog(@"Current Store URL (after iCloud to Local migration): %@", [localURL description]);

    // We'll write out a NSError here to see if there were any errors during the migration
    NSLog(@"Error from iCloud to local migration %@", error);

    // We'll just do a quick check to make sure are no errors with this procedure.
    NSLog(@"Erros's after all of that %@", error);

    NSLog(@"Current Store URL (after everything): %@", [localURL description]);

    [self removeCloudObservers];

问题

应用程序将在上面的migratePersistentStore 行崩溃,并出现上述错误。我不知道该怎么做才能使它正常工作。

currentStore 的注释掉代码表明我还尝试检查 lastObject,而不是 firstObject,在这两种情况下,我都得到了相同的结果。

我没有从本地到 iCloud 发生任何崩溃,因为我想确保,如果用户正在使用 iCloud 但后来选择不使用,他们的数据应该在本地迁移。

这个 (Migrate Persistant Store Crash) Stack Overflow 问题似乎是一个完美的选择,但首先答案不被接受,并且没有确认代码可以从提出问题的人那里得到,而且该代码没有不为我工作;它只是删除了数据。

对此的任何指导将不胜感激。

【问题讨论】:

【参考方案1】:

密切关注链接:Migrate Persistant Store Crash,我能够使用以下代码完成此操作:

NSPersistentStoreCoordinator * persistentStoreCoordinator = self.persistentStoreCoordinator;

NSPersistentStore * persistentStore = [[persistentStoreCoordinator persistentStores] firstObject];

if([[NSFileManager defaultManager]fileExistsAtPath:localURL.path])

    NSLog(@"File exists");
    [[NSFileManager defaultManager] removeItemAtPath:localURL.path error:&error];
    NSLog(@"Removing error = %@", error); 



[[NSFileManager defaultManager] copyItemAtPath:persistentStore.URL.path toPath:localURL.path error:&error];

NSLog(@"The copying error = %@", error);

NSPersistentStoreCoordinator * newPersistentStoreCoordinator;

newPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

[newPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType

                                            configuration:nil

                                                      URL:localURL

                                                  options:localStoreOptions

                                                    error:&error];

NSLog(@"The adding error = %@", error);

希望这能帮助遇到同样问题的人

【讨论】:

感谢您的回答!我应该什么时候调用迁移方法?因为如果用户删除应用并重新安装,iCloud 需要时间从云端检索数据

以上是关于在迁移时从 iCloud 迁移到本地商店崩溃的应用程序“对象不能为零” - 使用 Core Data的主要内容,如果未能解决你的问题,请参考以下文章

将 iCloud 商店迁移到本地

将 PersistentStoreCoordinator 从本地迁移到 iCloud 时数据重复

将 Core Data 应用程序迁移到 iCloud

由于核心数据迁移,应用程序在从应用商店更新后崩溃

iCloud 和轻量级迁移

在 iOS 7 中禁用 Core Data 中的 iCloud(也就是将持久存储文件迁移到本地)