Le modèle utilisé pour ouvrir le magasin est incompatible avec celui utilisé pour créer le magasin

182

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):

la nouvelle entité n'est pas regroupée dans xdatamodel

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.

dejoong
la source

Réponses:

297

La suppression de l'application n'est parfois pas le cas! Suggérer, votre application a déjà été publiée! Vous ne pouvez pas simplement ajouter une nouvelle entité à la base de données et continuer - vous devez effectuer la migration!

Pour ceux qui ne veulent pas fouiller dans la documentation et recherchent une solution rapide:

  1. Ouvrez votre fichier .xcdatamodeld
  2. cliquez sur Editor
  3. sélectionnez Ajouter une version de modèle ...
  4. Ajouter une nouvelle version de votre modèle (le nouveau groupe de modèles de données ajouté)
  5. sélectionnez le fichier principal, ouvrez l'inspecteur de fichiers (panneau de droite)
  6. et sous Versioned core data modelsélectionnez votre nouvelle version de modèle de données pour le modèle de données actuel
  7. CE N'EST PAS TOUT) Vous devez effectuer ce que l'on appelle une «migration légère».
  8. Accédez à votre AppDelegateet trouvez où le persistentStoreCoordinatorest créé
  9. Trouvez cette ligne if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Remplacez les niloptions par @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(réellement fournies dans le code commenté de cette méthode)
  11. Ici vous allez, amusez-vous!

PS Ceci s'applique uniquement à la migration légère. Pour que votre migration soit considérée comme une migration légère, vos modifications doivent être limitées à cette bande étroite:

  • Ajouter ou supprimer une propriété (attribut ou relation).
  • Rendre facultative une propriété non optionnelle.
  • Rendre un attribut facultatif non optionnel, tant que vous fournissez une valeur par défaut.
  • Ajouter ou supprimer une entité.
  • Renommez une propriété.
  • Renommez une entité.

Pour Swift 4

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Stas
la source
2
Le fichier principal est le .xcdatamodel que vous avez créé. Vous devez ouvrir le premier onglet du volet Utilitaires (côté droit) et trouver "Version du modèle" (Xcode 5.1) et sélectionner Actuel: "votre nouveau .xcdatamodel"
Stas
1
@ Computer_whiz123, dans XCode 5.1.1, il s'appelle 'Model Version'
Stas
1
Comment pourrais-je faire ça avec Swift?
Addison
2
J'obtiens cette erreur: "CoreData: error: -addPersistentStoreWithType: configuration SQLite: (null) URL: file: ///...file.sqlite options: {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1;} ... erreur renvoyée Erreur Domain = NSCocoaErrorDomain Code = 134130 "L'opération n'a pas pu être terminée. (Erreur Cocoa 134130.) "
CarmenA
3
Options de migration let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
rapide
285

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.

Philippe Sabourin
la source
merci pour Philippe répondu, j'ai essayé et cela n'a pas fonctionné :(, avez-vous une autre suggestion?
dejoong
Pouvez-vous publier le code que vous utilisez pour créer le modèle et le magasin permanent dans votre délégué d'application?
Philippe Sabourin le
C'est un peu déraisonnable pourquoi cela se produit et pourquoi une telle solution fait l'affaire, mais c'est ça ... je ne peux pas aider ... nywaz, voici mon vote ... le mieux que je puisse faire maintenant pour apprécier vos directives ... merci beaucoup pour l'aide compagnon. !!
Apple_iOS0304
M'a aidé à résoudre un problème dans Xcode 4.6, où j'ai envoyé à la corbeille tous mes fichiers de projets par erreur: /
ramirogm
6
Ceci est pour le développement uniquement! Pour la production, vous utilisez la gestion des versions et la migration des modèles. developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…
Philippe Sabourin
36

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.

Dhaval H. Nena
la source
1
Merci pour ce post, il est vraiment utile
Subramani
23

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.

Bhavin
la source
La réinitialisation du contenu et des paramètres dans le simulateur a résolu le problème pour moi! Merci.
septerr
14

Oui. Une fois que vous supprimez l'application sur l'appareil physique et que vous la reconstruisez, elle fonctionne.

world-software.net
la source
Cela a en fait résolu mon problème plutôt que la réponse acceptée. Merci!
Ken W
ce qui se passe en production ce n'est pas la réponse
Eduardo Oliveros
C'est une réponse horrible, vous devez ajouter la migration à votre nouveau modèle, sinon l'application plantera dans le produit
aryaxt
14

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])
Ali Asgher Lakkadshaw
la source
11

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];
Symétrique
la source
10

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.

Pierrotlefou
la source
20
Qu'en est-il des applications de production? Vont-ils se planter instantanément si vous envoyez une mise à jour sur l'App Store avec des modifications apportées aux données de base? Thx
rwyland
3
Oui, les modifications apportées au modèle de CD empêchent le chargement des données générées avec le modèle précédent. Pour gérer cela, vous devez détecter le problème et effectuer une migration des données de base.
Johan
8
  1. Arrêtez l'application de s'exécuter.
  2. Supprimer l'application sur le simulateur.
  3. Product -> Clean
  4. Construisez, exécutez.
Tom Howard
la source
4
mauvaise pratique en production, planter l'application
Eduardo Oliveros
7

La solution la plus simple qui a fonctionné pour moi dans Swift 2.1, Xcode 7 est:

  1. 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)

  2. Cmd + Shift + H à nouveau pour arrêter la danse des applications

  3. 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

Naishta
la source
2
mauvaise pratique en production, planter l'application
Eduardo Oliveros
6

Je viens de supprimer le [Simulator App Folder]/Document/*.sqlitefichier 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.

AHHP
la source
2
A travaillé pour moi aussi. Il semble raisonnable que cela suffise. Vous perdez cependant toutes les données déjà dans la base de données ...
Bor
6

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.

sarit bahuguna
la source
6

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 {
JZ.
la source
1
Je ne sais pas pourquoi cela a été rejeté, mais je l'ai corrigé. Merci d'avoir fourni la syntaxe de Swift.
Matt Long
Agréable! Ça marche! Merci! J'essaye de résoudre ce problème pendant 3 heures.
mr_ivan777
où mettre ce code? je charge les données de base avec ce code let container = NSPersistentContainer (nom: "modeldb") container.loadPersistentStores (completionHandler: {(storeDescription, error) in if let error = error as NSError? {
MAS. John
5

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

Josh10
la source
3
Si vous faites cela, cependant, le même problème ne se produira-t-il pas toujours pour les utilisateurs sur de vraies machines?
Maury Markowitz
4

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:

  1. Exécuter Clean (Cmd + Shift + K)
  2. Redémarrez le simulateur iOS
  3. Simulateur iOS -> Réinitialiser le contenu et les paramètres (depuis la barre de navigation)

(3) était l'étape qui l'a finalement fait fonctionner correctement. J'espère que cela t'aides!

bigtex777
la source
2

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

Mike
la source
2

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.

Thomas Zoechling
la source
Voici ma réponse pour la même chose pour la migration de données: stackoverflow.com/questions/8881453/…
Dhaval H. Nena
2

Premièrement, les seuls éléments qui devraient figurer dans le xcdatamodeldbundle sont les xcdatamodelfichiers. Vos sous-classes ne doivent PAS être dans le xcdatamodeld. 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 .

Marcus S. Zarra
la source
avez-vous une idée comment puis-je retirer le modèle du bundle xcdatamodel? ou shd je viens de le supprimer?
dejoong
Le modèle, qui est le xcdatamodelfichier doit être là. Ce sont les fichiers .h et .m qui doivent être déplacés. Utilisez Finder.
Marcus S.Zarra
1

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.

Jayprakash Dubey
la source
0

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!

Daveomcd
la source
0

J'ai eu ce problème - j'ai d'abord réinitialisé mon simulateur, puis nettoyé le projet et reconstruit. Et puis ça marche.

Yashu
la source
0

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:

  1. 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

  2. supprimer ou renommer le fichier sqlite

  3. Nettoyer et réexécuter l'application
  4. La réexécution de l'application générerait un nouveau fichier sqlite.

Cela garantira que le schéma et Xcode sont synchronisés.

Prashant Nidgunde
la source
-1

Pour le développement d'applications Mac:

  1. Nettoyez le projet
  2. Nettoyer les données dérivées
  3. Accédez à / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / et supprimez tous les fichiers qu'il contient (tels que ".sqlite", ".sqlite-shm" ...)

Cela a fonctionné pour moi, j'espère que cela pourrait être utile.

Eneko
la source
-2

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)

niravdesai21
la source
4
mauvaise pratique en production, planter l'application
Eduardo Oliveros