2015-10-27 6 views
18

Ho un oggetto NotSureItem in cui ho tre proprietà 'title' il cui nome è rinominato da 'text' e textDescription che ho aggiunto in seguito e una proprietà dateTime. Ora quando ho intenzione di eseguire la mia app si blocca quando voglio aggiungere qualcosa a queste proprietà. Mostra le seguenti dichiarazioni.RLMException, è richiesta la migrazione per il tipo di oggetto

"La migrazione è richiesta per il tipo di oggetto" NotSureItem "a causa dei seguenti errori: - Il" testo "di proprietà non è presente nell'ultimo modello di oggetto. - Il "titolo" della proprietà è stato aggiunto al modello di oggetto più recente. - La proprietà 'textDescription' è stata aggiunta al modello di oggetto più recente. '

Ecco il suo il mio codice:

import Foundation 
import Realm 

class NotSureItem: RLMObject { 
    dynamic var title = "" // renamed from 'text' 
    dynamic var textDescription = "" // added afterwards 
    dynamic var dateTime = NSDate() 
} 

risposta

74

Basta eliminare la vostra applicazione ed eseguirlo nuovamente.

Ogni volta che si modificano le proprietà sugli oggetti Realm, il database esistente diventa incompatibile con quello nuovo.

Finché sei ancora in fase di sviluppo, puoi semplicemente eliminare l'app dal simulatore/dispositivo e riavviarla.

Successivamente, quando l'app è stata pubblicata e si modificano le proprietà sugli oggetti, è necessario implementare una migrazione alla nuova versione del database.

+0

Perché il downvote? – joern

+1

funziona per me @joern –

+2

È la risposta corretta. Solo qualcuno lo ha svalutato. Potresti accettare la risposta se ha funzionato per te, quindi questa è contrassegnata come risposta corretta? – joern

5

Di seguito il codice sta lavorando per me

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; 
config.schemaVersion = 2; 
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) { 
    // The enumerateObjects:block: method iterates 
    // over every 'Person' object stored in the Realm file 
    [migration enumerateObjects:Person.className 
        block:^(RLMObject *oldObject, RLMObject *newObject) { 
    // Add the 'fullName' property only to Realms with a schema version of 0 
    if (oldSchemaVersion < 1) { 
     newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@", 
          oldObject[@"firstName"], 
          oldObject[@"lastName"]]; 
    } 

    // Add the 'email' property to Realms with a schema version of 0 or 1 
    if (oldSchemaVersion < 2) { 
    newObject[@"email"] = @""; 
    } 
    }]; 
}; 
[RLMRealmConfiguration setDefaultConfiguration:config]; 

// now that we have updated the schema version and provided a migration block, 
// opening an outdated Realm will automatically perform the migration and 
// opening the Realm will succeed 
[RLMRealm defaultRealm]; 

return YES; 
} 

Maggiori informazioni: https://realm.io/docs/objc/latest/#getting-started

3

Il database modificato non è più compatibile con il database salvato ed è per questo è necessaria una migrazione. Le tue opzioni sono di eliminare il vecchio file di database e ricominciare da zero (funziona alla grande se sei nella fase di sviluppo iniziale), o se sei vivo, esegui la migrazione.

Si esegue questa operazione definendo una versione dello schema e fornendo uno "script" di migrazione del database all'interno della configurazione di Realm. L'intero processo è documentato qui (insieme con esempi di codice): here

2

È possibile cancellare database su lancio in questo modo:

[[NSFileManager defaultManager] removeItemAtURL:[RLMRealmConfiguration defaultConfiguration].fileURL error:nil]; 
10

Elimina l'applicazione e reinstallare non è una buona pratica. Dovremmo incorporare alcune fasi di migrazione durante lo sviluppo dal primo momento in cui riscontriamo esigenze di migrazione. Il link fornito da SilentDirge è buono: realm migration document, che fornisce buoni esempi per la gestione di diverse situazioni.

Per un compito minima di migrazione, il seguente frammento di codice dal link qui sopra può fare automaticamente la migrazione e deve essere utilizzato con il metodo di AppDelegate disFinishLaunchWithOptions:

let config = Realm.Configuration(
 
    // Set the new schema version. This must be greater than the previously used 
 
    // version (if you've never set a schema version before, the version is 0). 
 
    schemaVersion: 1, 
 

 
    // Set the block which will be called automatically when opening a Realm with 
 
    // a schema version lower than the one set above 
 
    migrationBlock: { migration, oldSchemaVersion in 
 
    // We haven’t migrated anything yet, so oldSchemaVersion == 0 
 
    if (oldSchemaVersion < 1) { 
 
     // Nothing to do! 
 
     // Realm will automatically detect new properties and removed properties 
 
     // And will update the schema on disk automatically 
 
    } 
 
    }) 
 

 
// Tell Realm to use this new configuration object for the default Realm 
 
Realm.Configuration.defaultConfiguration = config 
 

 
// Now that we've told Realm how to handle the schema change, opening the file 
 
// will automatically perform the migration 
 
let _ = try! Realm()