我有同样的问题,我的解决方案是删除应用程序,然后由于数据库中的修改而再次安装它。
我一直在遵循these说明,以帮助将iCloud支持与CoreData集成在一起,但出现一些错误。
我在我的AppDelegate中拥有这个:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
//NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Little_Wedding_Book_Universal.sqlite"];
NSString *storePath = [[NSString stringWithFormat:@"%@", [self applicationDocumentsDirectory]] stringByAppendingPathComponent:@"appname.sqlite"];
NSURL *storeURL = [NSURL fileURLWithPath:storePath];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSPersistentStoreCoordinator* psc = persistentStoreCoordinator;
if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0"))
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSFileManager *fileManager = [NSFileManager defaultManager];
// Migrate datamodel
NSDictionary *options = nil;
// this needs to match the entitlements and provisioning profile
NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"J9VXW4WCE8.com.company.appname"];
NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];
if ([coreDataCloudContent length] != 0) {
// iCloud is available
cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];
options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
@"appname.store", NSPersistentStoreUbiquitousContentNameKey,
cloudURL, NSPersistentStoreUbiquitousContentURLKey,
nil];
}
else
{
// iCloud is not available
options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
}
NSError *error = nil;
[psc lock];
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[psc unlock];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"asynchronously added persistent store!");
[[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];
});
});
}
else
{
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
return persistentStoreCoordinator;
}
[在另一个视图控制器中,我创建了AppDelegate
的实例,创建了一个对象并调用[appDelegate saveContext];
,这是应用程序崩溃的地方。一直以来都运行良好(到目前为止,添加了iCloud支持)。
-(void)saveContext
{
NSError *error;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
}
因此它在此方法下崩溃,并且控制台向我显示此消息:
'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
我不知道该怎么办,帮忙!
编辑:下面的控制台日志:
启动应用程序后,我得到:
2012-08-22 17:39:47.906 appname[24351:707] asynchronously added persistent store!
2012-08-22 17:39:47.955 appname[24351:707] asynchronously added persistent store!
当应用崩溃时进行跟踪:
2012-08-22 17:41:31.657 appname[24351:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
*** First throw call stack:
(0x3749d88f 0x351a2259 0x36bf0fe7 0x36c59287 0xd648b 0x149e0b 0x373f73fd 0x3118ce07 0x3118cdc3 0x3118cda1 0x3118cb11 0x3118d449 0x3118b92b 0x3118b319 0x31171695 0x31170f3b 0x33bb322b 0x37471523 0x374714c5 0x37470313 0x373f34a5 0x373f336d 0x33bb2439 0x3119fcd5 0xd53dd 0xd5378)
terminate called throwing an exception(lldb)
您可能正在从两个(或多个)不同的线程中调用persistentStoreCoordinator
方法。直接或间接。
如所写,该方法不是线程安全的。
可能是您有其他方法也遇到相同的问题。通常,managedObjectContext
存在并且以类似方式写入。
有两种方法可以解决此问题:
@synchronize
使这些方法成为线程安全的nil
,>您可能还做错的第二件事是在初始化存储之前修改上下文(例如,向其中添加新的托管对象),然后尝试保存它。
要解决此问题,请确保您执行以下任一操作:
我有同样的问题,我的解决方案是删除应用程序,然后由于数据库中的修改而再次安装它。
我通过从模拟器中删除该应用并重新运行来解决了该问题。我猜是因为以前版本的应用程序没有核心数据。
通过将let moc = DataController()。managedObjectContext移动到类的顶部而不是留在func seedPerson()内部来解决
我在测试过程中看到一些错误,当我旋转一些临时RefetchAllDatabaseData
而不挂在任何地方时-ARC会将上下文从我下面随机释放出去。
结束工作是在测试中保留对MOC的引用,并在每次测试时将其重置。
不确定这与非测试环境的相关性如何,但是特别是如果您使用的是子级/同级上下文,则有必要确保它们仍然存在。 :P
我有同样的问题。 原因
解决方案:从设备/模拟器中删除应用程序。并重新安装]]。 (新版本将具有新架构,因此不会崩溃。)
重新更新。 XCODE 4.6.3和MACOSX 10.9.5:
为了解决该问题,我在xcode派生数据位置中删除了与该产品相关的应用程序目录:
rm -rd / Users // Library / Developer / Xcode / DerivedData /。显然,在使用对象模型后,数据变得混乱。
我也一直坚持这个问题。为此,我首先要检查核心数据迁移代码,因为在我的情况下该代码是正确的,所以我已经从设备中删除了我的应用,然后重新安装了它。而且有效。
[对我来说,我发现NSManagedObjectContext
在我的情况下总是返回addPersistentStoreWithType
。因此,持久性存储未成功创建。然后,我打印nil
storeURL
这是无效路径。所以我检查了代码,发现了一个愚蠢的错误。~/Library/Developer/CoreSimulator/Devices/1F8C6299-1F80-4212-9FE2-CA33BD365851/data/Containers/Data/Application/9CA7B7BB-A835-4BC2-B12D-23B84D420F91/Library/Documentation/my-database.sqlite
我有同样的问题,我的解决方案是删除应用程序,然后由于数据库中的修改而再次安装它。
我通过从模拟器中删除该应用并重新运行来解决了该问题。我猜是因为以前版本的应用程序没有核心数据。
通过将let moc = DataController()。managedObjectContext移动到类的顶部而不是留在func seedPerson()内部来解决
我在测试过程中看到一些错误,当我旋转一些临时RefetchAllDatabaseData
而不挂在任何地方时-ARC会将上下文从我下面随机释放出去。
我有同样的问题。 原因
重新更新。 XCODE 4.6.3和MACOSX 10.9.5:
为了解决该问题,我在xcode派生数据位置中删除了与该产品相关的应用程序目录:
我也一直坚持这个问题。为此,我首先要检查核心数据迁移代码,因为在我的情况下该代码是正确的,所以我已经从设备中删除了我的应用,然后重新安装了它。而且有效。
[对我来说,我发现NSManagedObjectContext
在我的情况下总是返回addPersistentStoreWithType
。因此,持久性存储未成功创建。然后,我打印nil
storeURL