在迁移时从 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的主要内容,如果未能解决你的问题,请参考以下文章