2016-02-03 10 views
6

Ho recentemente creato una nuova filiale e ho tentato di refactoring gran parte del mio codice per dare uno Realm uno scatto su CoreData. Ma finora non ho avuto fortuna a far funzionare il mio codice.RealmSwift: Realm su percorso già aperto con una diversa versione dello schema

In primo luogo, viene generata un'eccezione in shared_realm.cpp. La riga di codice che genera l'errore è:

if (realm->config().schema_version != config.schema_version && config.schema_version != ObjectStore::NotVersioned) { 
    throw MismatchedConfigException("Realm at path already opened with different schema version."); 
} 

Se mi salta sopra questa eccezione, si fermi sulla seconda riga di codice nel seguente:

class func getAllCategories() -> Results<Category> { 
    let realm = try! Realm() 
    let categories = realm.objects(Category) 

    return categories 
} 

e lancia questo messaggio di errore:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=1 "Realm at path already opened with different schema version." UserInfo={NSLocalizedDescription=Realm at path already opened with different schema version., Error Code=1}

Sono completamente nuovo nel Regno, quindi qualsiasi aiuto è apprezzato. La mia comprensione dalla documentazione è che Realm() è il modo corretto per accedere al database predefinito, che al momento è adatto ai miei scopi. All'inizio pensavo che forse un Reame doveva essere passato in giro, ma vedo dagli esempi online che questo non sembra essere il caso.

Ho pulito, modificato i simulatori e persino aggiornato Xcode. Ho anche tentato di commentare questa riga di codice in:

// FIXME - enable schema comparison 
/*if (realm->config().schema != config.schema) { 
    throw MismatchedConfigException("Realm at path already opened with different schema"); 
}*/ 

inutilmente. Sentirsi abbastanza perso, quindi ogni direzione è apprezzata.

+1

Si sta utilizzando un oggetto 'Configurazione' di Realm ovunque per configurare la configurazione predefinita per un Reame? Se è così, puoi postarlo qui? Inoltre, se stai apportando molte modifiche allo sviluppo all'oggetto 'Category', hai provato a eliminare il file Realm sul disco e a consentire a Realm di crearne uno nuovo? – TiM

risposta

1

La versione dello schema per un percorso non può essere modificata dopo l'apertura, quindi è necessario modificare lo schema prima di chiamare il percorso con setSchemaVersion.

setSchemaVersion(1, realmPath: Realm.defaultPath) { (migration, oldSchemaVersion) -> Void in 
    if oldSchemaVersion < 1 { 
     migration.enumerate(Category.className(), { (oldObject, newObject) -> Void in 
      let constant = oldObject!["constant"] as! String 
      newObject!["constant"] = constant 
     }) 
    } 
} 
1

Si potrebbe essere in esecuzione in questo problema, perché hai cambiato lo schema dopo aver già costruito l'applicazione una volta (solo una supposizione, si può confermare questo eliminando l'applicazione e la sua ricostruzione, che cancella anche il regno esistente database.)

Se questo è effettivamente il problema, è necessario esaminare https://realm.io/docs/swift/latest/#migrations che delinea il modo consigliato per risolvere questo problema.

Problemi correlati