J'ai créé un modèle Core Data dans xcode 3.2 et après la mise à niveau dans Xcode 4.2, j'ai ensuite ajouté une nouvelle entité de la sous-classe NSManagedObject (reportez-vous à la nouvelle entité).
Première chose, ça a l'air bizarre car ce n'est pas dans le même groupe que l'ancien. Voici l'image sur mon xcode 4.2 (AlkitabDB est celui que j'ai créé dans xcode 3.2, EndeDB est le nouveau de la version actuelle de xcode (4.2):
Deuxième chose, je l'ai laissé tel quel, puis j'ai accédé à la deuxième entité (la nouvelle) de la même manière que la première entité (l'ancienne), et l'erreur telle que intitulée apparaît.
Voici l'erreur:
2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}
7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
metadata = {
NSPersistenceFrameworkVersion = 320;
NSStoreModelVersionHashes = {
AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
};
NSStoreModelVersionHashesVersion = 3;
NSStoreModelVersionIdentifiers = (
);
NSStoreType = SQLite;
NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
"_NSAutoVacuumLevel" = 2;
};
reason = "The model used to open the store is incompatible with the one used to create the store";
}
J'ai cherché la solution avant et j'ai découvert que je devais supprimer l'appliation du simulateur et réexécuter l'application, et cela n'a pas fonctionné. Quelqu'un connaît-il une solution à ce problème? Veuillez aider.
let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
Supprimez l'application du simulateur et effectuez un nettoyage de votre projet. Cela devrait clarifier ces problèmes. Assurez-vous que vous n'êtes pas en cours d'exécution dans le débogueur lorsque vous supprimez l'application, sinon il ne la supprimera pas correctement.
Si vous voulez être sûr qu'il a disparu, recherchez dans ce répertoire
Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/
le dossier de votre application, sous la version que vous exécutez.Remarque: Ceci est pour le développement uniquement. Pour la production, vous devez implémenter une sorte de migration. Google "Core Data Migration", la migration légère étant la plus simple.
la source
Ajoutez simplement l' attribut Options lors de la création de persistentStoreCoordinator dans le fichier AppDelegate.m pour la méthode de données de base comme ci-dessous
OBJECTIF C
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSLog(@"persistentStoreCoordinator___"); NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"]; NSMutableDictionary *options = [[NSMutableDictionary alloc] init]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } NSLog(@"persistentStoreCoordinator___2"); return _persistentStoreCoordinator; }
RAPIDE
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. // Create the coordinator and store let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite") var failureReason = "There was an error creating or loading the application's saved data." // MAIN LINE OF CODE TO ADD let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] do { try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions) } catch { // Report any error we got. var dict = [String: AnyObject]() dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" dict[NSLocalizedFailureReasonErrorKey] = failureReason dict[NSUnderlyingErrorKey] = error as NSError let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) // Replace this with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)") abort() } return coordinator }
Cela avait résolu mon problème.
la source
Réponse: supprimez l'application du simulateur, effectuez un nettoyage et recréez votre projet.
Remarque: chaque fois que vous modifiez la définition des données de base, supprimez l'application installée sur le périphérique physique ou le simulateur, nettoyez le projet et reconstruisez à nouveau.
la source
Oui. Une fois que vous supprimez l'application sur l'appareil physique et que vous la reconstruisez, elle fonctionne.
la source
Pour swift, dans AppDelegate.swift, trouvez la ligne
try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: nil )
et remplacez-le par
try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
la source
Je viens de passer plusieurs jours à combattre cette erreur, ainsi que les plantages de mergedModelFromBundles et à obtenir l'erreur «Impossible de fusionner les modèles avec deux entités différentes nommées *».
Il s'avère que le problème racine était que Xcode ne supprime pas les anciennes ressources des appareils et que j'avais d'anciennes versions de mon modèle de données (fichiers .mom) qui provoquaient des conflits. C'est pourquoi la suppression de l'application a résolu le problème sur l'un de mes appareils.
Après avoir trouvé ce billet de blog via une autre réponse SO, j'ai rendu mon application plus tolérante aux anciens modèles en modifiant cette ligne qui recherche TOUS les fichiers .mom:
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
à ceci, qui ne regarde que dans le répertoire Filtres:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"]; NSURL *momURL = [NSURL fileURLWithPath:path]; NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
J'ai utilisé recursivePathsForResourcesOfType à partir de cette question : pour aider à comprendre cela en journalisant tous les fichiers .mom dans l'application:
NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]]; NSLog(@"All .mom files:%@",momPaths);
J'ai également utilisé iExplorer pour regarder les fichiers .mom superflus (je n'ai pas encore essayé de les supprimer).
La méthode ci-dessous a également été utile. Il a montré qu'une entité était dans le modèle fusionné retourné par [psc managedObjectModel] qui n'existait plus dans aucun de mes modèles ou dans le magasin lui-même. C'est ce qui m'a laissé croire qu'un ancien modèle était mis en cache sur l'appareil lui-même que le bâtiment propre n'a pas supprimé. La méthode enregistre chaque entité identique, modifiée, ajoutée ou supprimée du modèle. (écrit avec cette réponse SO comme point de départ):
- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL { NSError *error = nil; // Get the entities & keys from the persistent store coordinator NSManagedObjectModel *pscModel = [psc managedObjectModel]; NSDictionary *pscEntities = [pscModel entitiesByName]; NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]]; //NSLog(@"psc model:%@", pscModel); //NSLog(@"psc keys:%@", pscKeys); NSLog(@"psc contains %d entities", [pscModel.entities count]); // Get the entity hashes from the storeURL NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error]; NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"]; //NSLog(@"store metadata:%@", sourceMetadata); NSLog(@"store URL:%@", storeURL); NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]); NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]); NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]]; // Determine store entities that were added, removed, and in common (to/with psc) NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys]; NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys]; NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys]; NSMutableSet *changedEntities = [NSMutableSet new]; [addedEntities minusSet:storeKeys]; [removedEntities minusSet:pscKeys]; [commonEntities minusSet:removedEntities]; [commonEntities minusSet:addedEntities]; // Determine entities that have changed (with different hashes) [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) { if (storeHash != nil && pscDescrip.versionHash != nil) { [changedEntities addObject:key]; } } }]; // Remove changed entities from common list [commonEntities minusSet:changedEntities]; if ([commonEntities count] > 0) { NSLog(@"Common entities:"); [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash); }]; } if ([changedEntities count] > 0) { NSLog(@"Changed entities:"); [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; NSLog(@"\tpsc %@:\t%@", key, pscDescrip.versionHash); NSLog(@"\tstore %@:\t%@", key, storeHash); }]; } if ([addedEntities count] > 0) { NSLog(@"Added entities to psc model (not in store):"); [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash); }]; } if ([removedEntities count] > 0) { NSLog(@"Removed entities from psc model (exist in store):"); [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSLog(@"\t%@:\t%@", key, storeHash); }]; } BOOL pscCompatibile = [pscModel isConfiguration:nil compatibleWithStoreMetadata:storeMetadata]; NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes"); return pscCompatibile; }
usage: appelé avant d'ajouter chaque magasin à NSPersistentStoreCoordinator:
[self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL]; _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.iCloudStoreURL options:options error:&localError];
la source
Chaque fois que vous modifiez la définition de la date principale, vous devez supprimer les applications installées sur l'appareil physique ou le simulateur.
la source
Product
->Clean
la source
La solution la plus simple qui a fonctionné pour moi dans Swift 2.1, Xcode 7 est:
Supprimez l'application du simulateur (Cmd + Shift + H pour accéder à l'écran d'accueil. Appuyez longuement sur l'application, cliquez sur la croix, comme d'habitude pour supprimer une application de votre téléphone)
Cmd + Shift + H à nouveau pour arrêter la danse des applications
Revenez à votre projet et relancez
J'ai eu ce problème lors de l'écriture / lecture à partir de Core Data avec 2 entités configurées. La suppression de l'application et la réexécution du programme ont résolu le problème
la source
Je viens de supprimer le
[Simulator App Folder]/Document/*.sqlite
fichier après avoir apporté des modifications aux entités et cela a fonctionné. Et bien sûr, le fichier .sqlite contient toutes les données et structures stockées qui seront perdues.la source
S'il vous plaît supprimer une application du simulateur et nettoyer un code et exécuter. Cela fonctionne bien .do cela peut être son aide VOUS.
la source
Si vous utilisez Swift.
Suivez la réponse de @Stas et insérez des options, au lieu de zéro, dans votre délégué d'application:
let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {
la source
Essayez "Réinitialiser le contenu et les paramètres" dans le simulateur. A travaillé pour moi après la suppression de l'application et de la version propre
la source
J'ai rencontré le même problème avec mon application (pas encore publiée dans l'App Store).
Voici comment je l'ai résolu:
(3) était l'étape qui l'a finalement fait fonctionner correctement. J'espère que cela t'aides!
la source
Bien que parfois vous puissiez simplement supprimer l'application de l'appareil lors du changement de schéma dans le modèle d'objet géré, dans certains scénarios, cela n'est pas possible, par exemple parce que vous avez déjà publié votre application avec un ancien schéma.
Si tel est le cas, vous devez vous occuper de la migration des anciennes données vers le nouveau schéma:
Gestion des versions et migration des données du modèle de données de base
la source
Vous devrez migrer le modèle Core Data à l'aide de la migration. Chaque fois que vous modifiez le modèle, vous le rendez incompatible sans contrôle de version. Attachez-vous, c'est un sujet un peu poilu.
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html
la source
Si vous apportez des modifications à votre modèle Core Data, vous devez fournir une stratégie de migration qui indique à Core Data comment adopter les objets persistants existants (que vos utilisateurs ont créés avec la version actuellement publiée) dans le nouveau modèle.
Pour certains scénarios, Core Data est en mesure de déduire automatiquement le mappage de l'ancien modèle vers le nouveau. Pour des modifications plus complexes, vous devrez peut-être implémenter une logique qui effectue la migration.
Vous trouverez des détails dans le Guide de programmation de la gestion des versions et de la migration des données du modèle de base de données .
Mise à jour
Cette réponse ici sur Stack Overflow couvre les bases de la migration légère de Core Data et contient également du code pour vous aider à démarrer.
la source
Premièrement, les seuls éléments qui devraient figurer dans le
xcdatamodeld
bundle sont lesxcdatamodel
fichiers. Vos sous-classes ne doivent PAS être dans lexcdatamodeld
. Faites-les sortir de là. Il y a de fortes chances qu'ils déroutent le compilateur.Deuxièmement, l'erreur indique que Core Data ne trouve pas votre modèle. Avez-vous créé des données et ensuite touché le modèle? Si tel est le cas, vous êtes dans un état incohérent et devez corriger cela soit en supprimant les données (ce que Philippe a suggéré), soit en annulant vos modifications du modèle BACK .
la source
xcdatamodel
fichier doit être là. Ce sont les fichiers .h et .m qui doivent être déplacés. Utilisez Finder.Ce problème se produit généralement en raison d'une incompatibilité entre la version sur laquelle la base de données a été créée. L'approche générale de ce problème consiste à supprimer l'application et à la réinstaller . Mais dans votre cas mentionné, la version de DB est complètement différente sur Xcode 3.2 et 4.2. Il vaut donc mieux utiliser la même version de Xcode pour DB.
la source
J'obtenais l'erreur mais la raison pour laquelle j'obtenais l'erreur était à cause de ce qui suit.
À l'origine, j'avais une entité nommée «Entrée» et j'avais une ligne enregistrée pour cette entité dans la base de données. J'ai ensuite ajouté une autre entité nommée "Person" et après avoir ajouté cela, je suis allé construire et j'ai obtenu l'erreur. J'ai donc résolu le problème en supprimant l'entité «Personne», puis en créant l'application, en supprimant la ligne qui se trouvait dans «Entrée», puis en fermant l'application. J'ai ensuite supprimé l'application entièrement de mon téléphone, puis j'ai fait une reconstruction et cela a bien fonctionné. Vous ne savez pas quelle étape a corrigé le problème (la suppression de la ligne ou de l'application), mais j'espère que si vous recherchez une solution, cela vous aidera. :)
Edit: Oh et si vous vous inquiétez de supprimer votre nouvelle entité (dans mon cas "Person") pour reconstruire l'application, souvenez-vous que vous pouvez la récupérer par la suite en utilisant CMD + Z!
la source
J'ai eu ce problème - j'ai d'abord réinitialisé mon simulateur, puis nettoyé le projet et reconstruit. Et puis ça marche.
la source
Lorsque vous modifiez les données de base (ajout d'un champ à la table, suppression d'un champ, etc.), le fichier sqlite dans le dossier du document des applications doit être synchronisé avec votre schéma.
Ce fichier n'est pas écrasé par défaut, ce fichier doit être régénéré.
Suivez ces étapes:
Accédez au dossier indiqué par NSURL. (Ce chemin peut être trouvé dans le message d'exception généré par l'application avant la panne.) Exemple: / Utilisateurs // Bibliothèque / Application Support / iPhone Simulator // Applications // Documents
supprimer ou renommer le fichier sqlite
Cela garantira que le schéma et Xcode sont synchronisés.
la source
Pour le développement d'applications Mac:
Cela a fonctionné pour moi, j'espère que cela pourrait être utile.
la source
Simulateur iOS -> Réinitialiser le contenu et les paramètres ...
A travaillé pour moi
Simulateur iOS -> Réinitialiser le contenu et les paramètres ... -> Réinitialiser fonctionne également sur iOS9 (xcode 7.1)
la source