2013-04-19 4 views
11

Ho un progetto che utilizza i dati principali, ho bisogno di aggiungere più attributi (colonne) all'entità esistente (colonna), se aggiungo manualmente l'attributo al crash di app del modello dati ed è dovuto al salvataggio del contesto che ho usato per inserire i dati nella tabella in precedenzaCome aggiungere altri attributi all'entità dati core esistente?

plz help .. Grazie

risposta

21

Se si desidera modificare gli attributi nel modello di dati codice esistente, allora è necessario seguire alcuni passi ... si prega di fare riferimento a questo customizing-core-data-migrations

O questo ti aiuterebbe molto how-to-perform-a-lightweight-core-data-migration

+0

Ha aiutato grazie! –

+12

Si prega di evitare di rispondere con gli URL, o almeno di incollare gli evidenziatori che rispondono alla domanda. Non puoi garantire che un link esterno sarà sempre lì ... – dooleyo

+1

E, infatti, il primo link è morto - Bad Gateway. – rattletrap99

4

Se si aggiungono solo attributi a un'entità, è possibile utilizzare lo lightweight migration automatizzato in Dati principali.

Fondamentalmente tutto ciò che si deve fare è passare un'istanza NSDictionary con le opzioni appropriate quando si aggiunge l'archivio persistente. Ecco un frammento di codice dalla fine di un metodo di accesso per _persistentStoreCoordinator:

NSNumber *optionYes = [NSNumber numberWithBool:YES]; 
NSDictionary *options = [NSDictionary dictionaryWithObjects:@[optionYes] forKeys:@[NSMigratePersistentStoresAutomaticallyOption]]; 
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
    NSLog(@"Error opening persistent store: %@, %@", error, [error userInfo]); 
    abort(); 
} 
return _persistentStoreCoordinator; 

Se la migrazione è troppo complesso per una migrazione leggero, vedrete un errore. In caso contrario, la migrazione dovrebbe essere eseguita e il database verrà aggiornato in modo che corrisponda al nuovo schema.

Si noti che se si esegue questa operazione in modo reale su un dispositivo, è necessario eseguire prima il backup del file .sqlite, nel caso in cui qualcosa vada storto durante la migrazione.

2

Quindi il mio problema era che non avevo idea di dove questo persistente codice del coordinatore del negozio vada. Si scopre che viene automaticamente creato nell'implementazione AppDelegate quando si seleziona "Utilizza dati principali" durante la creazione del progetto.

Così, dal secondo link here, tutto quello che dovete fare per una migrazione leggero (l'aggiunta di nuovi attributi e simili) è il seguente:

  1. Selezionare la .xcdatamodeld
  2. Dal menu , scegli Editor -> Aggiungi modello Versione
  3. Assegna alla nuova versione qualsiasi cosa desideri, seleziona la versione precedente in "Basato sul modello"
  4. In File Inspector di .xcdatamodeld, scegli Model Version -> Current -> il tuo nuovo modello versione
  5. Selezionare la nuova versione del modello all'interno di .xcdatamodeld in Project Navigator ed effettuare le modifiche al modello
  6. Se sono stati modificati i nomi degli attributi o tipi, creare un modello di mappatura, nuovo file -> Dati di base -> Modello di mappatura -> raccogliere le versioni di origine e di destinazione modello
  7. Aggiornare la mappatura nel nuovo modello di mappatura

Cambia la tua AppDelegate archivio permanente codice coordinatore come segue.

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
    var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("<data model name>.sqlite") 
    var error: NSError? = nil 
    var failureReason = "There was an error creating or loading the application's saved data." 
    let options = [ 
    NSMigratePersistentStoresAutomaticallyOption: true, 
    NSInferMappingModelAutomaticallyOption: true] 
    if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil { 
     coordinator = nil 
     // 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 
     error = 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 \(error), \(error!.userInfo)") 
     abort() 
    } 

    return coordinator 
}() 

Quindi si aggiunge solo opzioni di migrazione alla chiamata addPersistentStoreWithType.