【发布时间】:2016-02-04 20:28:13
【问题描述】:
在我的应用程序中,我使用 CoreData 来保存数据,并且我正在从服务器推送和拉取数据。我还使用同一个帐户在多台设备上同步数据。
但是最近,我从 crashLytics 报告中得到了这个崩溃。
This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation
所以在下面的函数中,我以这种方式调用“saveContext”方法。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
//Creating a new instance of an managed object.
Entity *cycle = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:appDelegate.managedObjectContext];
[cycle setEmailID:m_emailId];
[cycle setStartDate:dateFromServer];
[cycle setEndDate:dateFromServer];
[appDelegate saveContext];
}
//appDelegate.m
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil)
{
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"LoveCycles.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
{
*/
//NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
//abort();
}
return _persistentStoreCoordinator;
}
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
*/
// NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
//abort();
}
}
}
创建托管对象上下文 (MOC)
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil)
{
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
所以我没有什么疑问。
1) 我应该每次都调用"[appDelegate saveContext]",数据是从服务器接收的,还是应该只在应用退出时保存。
2) CrashLytics 报告指向"[appDelegate saveContext]"。这也发生在 iOS 9 上。
3) 我无法在运行 iOS 9 的设备上复制此问题。因此不了解用户是否真的看到此崩溃,以及此错误的后果是什么。
【问题讨论】:
-
错误告诉您 managedObjectContext 没有与之关联的持久存储。您可能需要取消注释您的错误处理代码,因为您对 persistentStoreCoordinator{} 的调用可能会失败。
-
嘿@DuncanGroenewald,我的代码正确吗?
-
@DuncanGroenewald,我取消注释并尝试过。但没有崩溃。
-
使用用户的设备可能空间不足或类似情况,您需要更优雅地处理错误,而不是注释掉中止并让它运行直到出现其他问题。大概您在日志中没有看到很多这种崩溃?
-
@Wain 我在日志中看到很多崩溃。此外,它们的 RAM 较少,只有 141MB,但它们有 18GB 空间,这些数据来自崩溃日志。
标签: ios objective-c core-data nspersistentstore