J'ai suivi ces instructions pour intégrer le support iCloud à CoreData et des erreurs se sont produites.
J'ai ceci dans mon 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;
}
Dans un autre contrôleur de vue, je crée une instance de ma AppDelegate
, crée un objet et appelle [appDelegate saveContext];
C'est ici que l'application se bloque. Cela a toujours parfaitement fonctionné (jusqu'à maintenant, en ajoutant le support 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
}
}
}
Donc, il se bloque à cette méthode, et la console me donne ce message:
'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
Je ne sais pas quoi faire, aidez-moi!
EDIT: Journal de la console ci-dessous:
En lançant l'application, je reçois:
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!
Suivi lorsque l'application se bloque avec:
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)
Vous appelez probablement la méthode persistentStoreCoordinator
à partir de deux (ou plus) threads différents. Directement ou indirectement.
Comme écrit, cette méthode n'est pas thread-safe.
Il se peut que vous ayez d’autres méthodes avec le même problème. De manière générale, managedObjectContext
existe et est écrit de manière similaire.
Il y a deux façons de résoudre ce problème:
@synchronize
pour sécuriser ces méthodesnil
La deuxième chose que vous pouvez également faire mal consiste à modifier le contexte (par exemple, en lui ajoutant de nouveaux objets gérés), puis en essayant de le sauvegarder avant l'initialisation du magasin.
Pour résoudre ce problème, assurez-vous d’effectuer l’une des opérations suivantes:
RefetchAllDatabaseData
et que vous remarquez que la base de données est vide).J'ai eu le même problème et ma solution a été de supprimer l'application et de la réinstaller à cause de modifications dans la base de données.
Je l'ai résolu en supprimant l'application du simulateur et en l'exécutant à nouveau. Je suppose que cela se produit car la version précédente de l'application ne contient pas de données de base.
J'ai vu cette erreur lors des tests lorsque j'ai filé quelques NSManagedObjectContext
s temporaires sans les raccrocher n'importe où - le contexte serait désalloué de manière aléatoire par ARC.
Ce qui a finalement fonctionné, c’est de garder une référence au MOC sur les tests et de le réinitialiser pour chaque test.
Vous ne savez pas si cela est pertinent pour des circonstances autres que celles du test, mais en particulier si vous utilisez des contextes enfant/frère/sœur, il est utile de s'assurer qu'ils sont toujours là. : P
J'ai eu le même problème. La raison L'erreur me causait parce que j'avais apporté quelques modifications mineures modifications dans mon schéma CoreData Entity} _ (J'ai ajouté 2 ou 3 nouveaux attributs). Et je l'ai oublié car il ne génère aucune erreur jusqu'à ce que nous l'exécutions. Donc, ce qui se passe, c'est que l'application qui fonctionnait auparavant avait déjà le magasin persistant avec le schéma précédent. Le nouveau schéma pointe donc vers le même magasin. C’est pourquoi, lorsque nous l’exécutons, nous rencontrons l’erreur lorsque nous essayons d’accéder aux nouveaux attributs.
Solution: Supprimez l'application du périphérique/simulateur. Et réinstallez-la. (La nouvelle version aura le nouveau schéma et par conséquent ne plantera pas.)
Résolu en déplaçant le let moc = DataController (). ManagedObjectContext vers le haut de la classe au lieu de rester à l'intérieur du func seedPerson ()
J'ai aussi collé avec ce problème. Pour cela, je dois d’abord vérifier le code de migration des données de base. Comme le code était correct dans mon cas, j’ai supprimé mon application du périphérique, puis je l’ai réinstallée. Et il fonctionne.
Mise à jour re. XCODE 4.6.3 et MACOSX 10.9.5:
Pour résoudre le problème, j'ai supprimé le répertoire d'applications lié au produit dans l'emplacement de données dérivées de xcode:
rm -rd/Utilisateurs // Bibliothèque/Développeur/Xcode/DerivedData /. Apparemment, les données sont altérées après avoir joué avec le modèle objet.