NSPersistentStoreCoordinator не имеет постоянных хранилищ. Невозможно выполнить операцию сохранения.(IOS 9)
В моем приложении я использую 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. Поэтому не понимаю, действительно ли пользователь видит этот сбой и каковы последствия этой ошибки.
1 ответ
Где-то вам нужно связать ManagedObjectContext с persistentStore, например так (код Swift):
lazy var managedObjectContext: NSManagedObjectContext? = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
FLOG(5, message: " Error getting managedObjectContext because persistentStoreCoordinator is nil")
return nil
}
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
// Set the MergePolicy to prioritise external inputs
let mergePolicy = NSMergePolicy(mergeType:NSMergePolicyType.MergeByPropertyStoreTrumpMergePolicyType )
managedObjectContext.mergePolicy = mergePolicy
return managedObjectContext
}()