Il modello utilizzato per aprire il negozio è incompatibile con quello utilizzato per creare il negozio

Ho creato un modello Core Data in xcode 3.2 e dopo l’aggiornamento in Xcode 4.2, ho quindi aggiunto una nuova quadro della sottoclass NSManagedObject (fare riferimento alla nuova quadro).

Per prima cosa, sembra strano perché non è nello stesso gruppo di quello vecchio. Ecco l’immagine sul mio xcode 4.2 (AlkitabDB è quello che ho creato in xcode 3.2, EndeDB è il nuovo dalla versione attuale xcode (4.2):

la nuova entità non è raggruppata in xdatamodel

Seconda cosa, l’ho lasciato così com’è, quindi ho avuto accesso alla seconda quadro (quella nuova) allo stesso modo della prima quadro (quella vecchia), e appare l’errore come titolato.

Ecco l’errore:

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={type = immutable dict, count = 7, entries => 2 : {contents = "NSStoreModelVersionIdentifiers"} = {type = immutable, count = 0, values = ()} 4 : {contents = "NSPersistenceFrameworkVersion"} = {value = +320, type = kCFNumberSInt64Type} 6 : {contents = "NSStoreModelVersionHashes"} = {type = immutable dict, count = 1, entries => 0 : {contents = "AlkitabDB"} = {length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd} } 7 : {contents = "NSStoreUUID"} = {contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"} 8 : {contents = "NSStoreType"} = {contents = "SQLite"} 9 : {contents = "NSStoreModelVersionHashesVersion"} = {value = +3, type = kCFNumberSInt32Type} 10 : {contents = "_NSAutoVacuumLevel"} = {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 = ; }; 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"; } 

Ho cercato la soluzione prima e ho scoperto che dovevo rimuovere l’app dal simulatore e rieseguire l’app, e non ha funzionato. Qualcuno conosce una soluzione per questo problema? Per favore aiuto.

Rimuovi l’app dal simulatore ed esegui una pulizia sul tuo progetto. Questo dovrebbe chiarire questi problemi. Assicurati di non essere in esecuzione nel debugger quando elimini l’app, altrimenti non la eliminerà in modo corretto.

Se vuoi essere sicuro che sia andato, controlla questa directory Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/ per la cartella della tua app, con la versione che stai utilizzando.

Nota: questo è solo per lo sviluppo. Per la produzione, è necessario implementare una sorta di migrazione. Google “Core Data Migration”, con migrazione leggera come la più semplice.

L’eliminazione dell’app a volte non è il caso! Suggerisci, la tua app è già stata pubblicata! Non puoi semplicemente aggiungere una nuova entity framework al data base e andare avanti: devi eseguire la migrazione!

Per coloro che non vogliono scavare nella documentazione e sta cercando una soluzione rapida:

  1. Apri il tuo file .xcdatamodeld
  2. clicca su Editor
  3. selezionare Aggiungi versione del modello …
  4. Aggiungi una nuova versione del tuo modello (il nuovo gruppo di datamodels aggiunto)
  5. seleziona il file principale, apri l’ispettore file (pannello di destra)
  6. e in Versioned core data model versione, selezionare la nuova versione del modello dati per il modello dati corrente
  7. NON TUTTO) Dovresti eseguire la cosiddetta “migrazione leggera”.
  8. Vai a AppDelegate e trova dove è stato creato persistentStoreCoordinator
  9. Trova questa riga if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Sostituisci le opzioni nil con @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} (effettivamente fornito nel codice commentato in quel metodo)
  11. Ecco, divertiti!

PS Questo vale solo per la migrazione leggera. Affinché la migrazione possa essere considerata una migrazione leggera, le modifiche devono essere limitate a questa banda limitata:

  • Aggiungi o rimuovi una proprietà (attributo o relazione).
  • Rendi opzionale una proprietà non facoltativa.
  • Rendi un attributo facoltativo non facoltativo, purché tu fornisca un valore predefinito.
  • Aggiungi o rimuovi un’ quadro.
  • Rinominare una proprietà.
  • Rinominare un’ quadro.

Basta aggiungere l’attributo Options durante la creazione di persistentStoreCoordinator nel file AppDelegate.m per il metodo dei dati di base come di seguito

Objective-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; } 

SWIFT

  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 } 

Aveva risolto il mio problema ..

Risposta: rimuovere l’app dal simulatore, eseguire una pulizia e ribuild il progetto.

Nota: ogni volta che si apportano modifiche alla definizione dei dati principali, eliminare l’app installata sul dispositivo fisico o sul simulatore, pulire nuovamente il progetto e ricominciare.

Sì. Una volta eliminata l’app sul dispositivo fisico e la ricostruzione funziona.

Per il rapido, in AppDelegate.swift trovi la linea

 try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: nil ) 

e sostituirlo con

 try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]) 

Ogni volta che apporti modifiche alla definizione della Data principale, devi eliminare le app installate sul dispositivo fisico o sul simulatore.

Ho appena trascorso diversi giorni a combattere questo errore, così come gli arresti di MeredModelFromBundles e ottenere l’errore “Imansible unire i modelli con due quadro diverse di nome *”.

Risulta che il problema principale era che Xcode non rimuoveva vecchie risorse dai dispositivi e avevo vecchie versioni del mio modello di dati (file .mom) che causavano conflitti. Questo è il motivo per cui l’eliminazione dell’applicazione ha risolto il problema su uno dei miei dispositivi.

Dopo aver trovato questo post sul blog tramite un’altra risposta SO, ho reso la mia app più tollerante rispetto ai vecchi modelli cambiando questa riga che cerca TUTTI i file .mom:

 NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; 

a questo, che guarda solo nella cartella Filters:

 NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"]; NSURL *momURL = [NSURL fileURLWithPath:path]; NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

Ho usato recursivePathsForResourcesOfType da questa domanda così : per aiutare a capirlo, loggando tutti i file .mom nell’app:

 NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]]; NSLog(@"All .mom files:%@",momPaths); 

Ho anche usato iExplorer per guardare i file .mom estranei (non ho provato a eliminarli ancora).

Anche il metodo di seguito è stato utile. Ha mostrato che un’ quadro era nel modello unito restituito da [psc managedObjectModel] che non esisteva più in nessuno dei miei modelli o nel negozio stesso. Questo è ciò che mi ha fatto credere che un vecchio modello fosse stato memorizzato nella cache sul dispositivo stesso, che l’edificio pulito non ha rimosso. Il metodo registra ogni entity framework uguale, modificata, aggiunta o rimossa dal modello. (scritto con questa risposta SO come punto di partenza):

 - (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? %@", [email protected]"no":@"yes"); return pscCompatibile; } 

utilizzo: chiamato prima di aggiungere ogni negozio a NSPersistentStoreCoordinator:

  [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL]; _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.iCloudStoreURL options:options error:&localError]; 
  1. Arresta l’app dall’esecuzione.
  2. Elimina app sul simulatore.
  3. Product -> Clean
  4. Costruisci, corri.

La soluzione più semplice che ha funzionato per me in Swift 2.1, Xcode 7 è:

  1. Eliminare l’app dal Simulatore (Cmd + Shift + H per andare alla schermata principale.) Premere a lungo l’app, fare clic su croce, nel modo solito in cui si elimina un’app dal telefono)

  2. Cmd + Shift + H di nuovo per interrompere la danza delle app

  3. Torna al tuo progetto e riesegui

Ho avuto questo problema durante la scrittura / lettura da Core Data con 2 entity framework impostate. L’eliminazione dell’app e il riesecuzione del programma hanno risolto il problema

Ho appena cancellato il file [Simulator App Folder]/Document/*.sqlite dopo aver apportato modifiche alle quadro e ha funzionato. E, naturalmente, il file .sqlite contiene tutti i dati e le strutture memorizzati che andranno persi.

Si prega di eliminare un’applicazione dal simulatore e pulire un codice ed eseguire. Funziona bene. Può essere il suo aiuto.

Se stai usando Swift.

Segui la risposta da @Stas e inserisci le opzioni, al posto di nil, nel tuo delegato dell’app:

 let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil { 

Prova “Ripristina contenuto e impostazioni” nel simulatore. Ha funzionato per me dopo aver eliminato l’app e Clean build

Ho riscontrato lo stesso problema con la mia app (non ancora rilasciata in App Store).

Ecco come l’ho risolto:

  1. Esegui pulito (Cmd + Maiusc + K)
  2. Riavvia iOS Simulator
  3. iOS Simulator -> Reimposta il contenuto e le impostazioni (dalla barra di navigazione)

(3) è stato il passo che finalmente l’ha fatto funzionare correttamente. Spero che questo ti aiuti!

Sebbene a volte sia ansible rimuovere l’app dal dispositivo solo quando si modifica lo schema nel modello di oggetti gestiti, in alcuni scenari ciò non è ansible, ad esempio perché hai già pubblicato l’app con uno schema precedente.

In questo caso, devi occuparti della migrazione dei vecchi dati al nuovo schema:

Coreing del modello di dati di base e migrazione dei dati

Avrai bisogno di migrare il modello Core Data usando la migrazione. Ogni volta che cambi il modello, lo rendi incompatibile senza versioning. Mettiti comodo, è un argomento un po ‘peloso.

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html

Se apporti modifiche al tuo modello di Core Data, devi fornire una politica di migrazione che indichi a Core Data come adottare gli oggetti persistenti esistenti (creati dagli utenti con la versione attualmente rilasciata) nel nuovo modello.

Per alcuni scenari, Core Data è in grado di inferire automaticamente la mapping dal vecchio modello a quello nuovo. Per modifiche più complesse, potrebbe essere necessario implementare una logica che esegua la migrazione.

È ansible trovare i dettagli nella Guida alla programmazione di Versioning e Migrazione dei dati del modello di dati di base .

Aggiornare
Questa risposta qui su Stack Overflow copre le basi della migrazione leggera di Core Data e ha anche del codice per iniziare.

Questo problema si verifica in genere a causa dell’incompatibilità tra la versione su cui è stato creato il DB . L’approccio generale a questo problema è quello di eliminare l’app e reinstallarla . Ma nel tuo caso citato la versione di DB è completamente diversa su Xcode 3.2 e 4.2. Quindi meglio usare la stessa versione di Xcode per DB.

Innanzitutto, le uniche cose che dovrebbero essere nel pacchetto xcdatamodel sono i file xcdatamodel . Le sottoclassi NON dovrebbero essere in xcdatamodeld . Sposta quelli fuori di lì. C’è una buona possibilità che confondano il compilatore.

Secondo, l’errore indica che i Core Data non riescono a trovare il tuo modello. Hai creato i dati e poi hai toccato il modello? Se è così, ci si trova in uno stato incoerente e occorre correggerlo eliminando i dati (suggeriti da Philippe) o modificando le modifiche del modello INDIETRO .

Stavo ricevendo l’errore, ma il motivo per cui stavo ottenendo l’errore era a causa di quanto segue.

Originariamente avevo una Entity chiamata “Entry” e avevo una riga salvata per quell’ quadro nel database. Ho quindi aggiunto un’altra quadro denominata “Persona” e dopo aver aggiunto che è andato a build e ha ottenuto l’errore. Così ho risolto il problema eliminando Entità “Persona” e poi costruendo l’app, cancellando la riga che era in “Voce” e quindi chiudendo l’applicazione. Ho quindi cancellato l’app completamente dal mio telefono e poi ho fatto una ricostruzione e ha funzionato bene. Non sei sicuro di quale passo abbia corretto il problema (la cancellazione della riga o dell’app), ma spero che se stai cercando una soluzione questo ti sarà d’aiuto. 🙂

Modifica: Oh e se ti preoccupi di cancellare la tua nuova Entità (nel mio caso “Persona”) per build di nuovo l’app ricorda di poterla recuperare in seguito usando CMD + Z!

Ho avuto questo problema: ho prima resettato il mio simulatore e poi ho pulito il progetto e ricostruito. E poi funziona.

Quando si modificano i dati di base, (aggiungendo un campo alla tabella, rimuovendo campo ecc.), Il file sqlite nella cartella documenti delle applicazioni deve essere sincronizzato con lo schema.

Questo file non viene sovrascritto per impostazione predefinita, questo file deve essere rigenerato.

Segui questi passi:

  1. Vai alla cartella indicata da NSURL. (Questo percorso può essere trovato nel messaggio di eccezione generato dall’applicazione prima dell’arresto anomalo.) Esempio: / Utenti // Libreria / Application Support / iPhone Simulator // Applicazioni // Documenti

  2. rimuovere o rinominare il file sqlite

  3. Pulisci e riesegui l’applicazione
  4. La riesecuzione dell’applicazione genera un nuovo file sqlite.

Ciò assicurerà che lo schema e Xcode siano sincronizzati.

Per lo sviluppo di app per Mac:

  1. Pulisci il progetto
  2. Pulisci i dati derivati
  3. Vai su / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / e cancella tutti i file all’interno (come “.sqlite”, “.sqlite-shm” …)

Ha funzionato per me, spero che questo possa essere utile.

iOS Simulator -> Reimposta i contenuti e le impostazioni …

Ha funzionato per me

iOS Simulator -> Reimposta i contenuti e le impostazioni … -> Ripristina Works su iOS9 (xcode 7.1)