2015-12-14 12 views
8

Dodałem nowy atrybut tablicy do RLMObject iSwift Realm Własność '*' został dodany do najnowszej obiektowego modelu migracji

public class Student: RLMObject { 
    dynamic var id = 0 
    dynamic var name = "" 
    dynamic var resultList = RLMArray(objectClassName:Result.className()) 
} 

public class Result: RLMObject { 
} 

ERROR Log:

Migracja jest wymagany dla obiektów typu ' Uczeń z powodu następujących błędów: : Właściwość "ResultList" została dodana do najnowszego modelu obiektu.

TRY Failed:

let configuration:RLMRealmConfiguration = RLMRealmConfiguration.defaultConfiguration() 

migration.enumerateObjects(Student.className()) { oldObject, newObject in 
    newObject!["resultList"] = RLMArray(objectClassName: Result.className()) 
} 

EDIT:

let configuration:RLMRealmConfiguration = RLMRealmConfiguration.defaultConfiguration() 
    print("Realm db current version: \(configuration.schemaVersion)") 
    configuration.schemaVersion = 1 
    configuration.migrationBlock = {(migration:RLMMigration, oldSchemaVersion: UInt64) in 
     print("Realm db migration start") 
     if oldSchemaVersion < 1 { 
      print("Schema version: 1 - Rename fields") 
      migration.enumerateObjects(Student.className()) { oldObject, newObject in 
       newObject!["creationDate"] = oldObject!["createdAt"] 
       newObject!["modifiedDate"] = oldObject!["updatedAt"] 
      } 
     } 
     print("Realm db migration finish") 
    } 
    RLMRealmConfiguration.setDefaultConfiguration(configuration) 
    let realm = RLMRealm.defaultRealm() 

ROZWIĄZANIE:

Aktualizacja wersja do +1

configuration.schemaVersion += 1 
+0

Wydaje się, że używasz dość starej wersji Królestwa? – Shripada

+0

Skąd się bierze obiekt "migracja"? Czy wprowadzasz jakieś zmiany do swojej konfiguracji? – marius

+0

@marius zaktualizował mój pełny kod – AJit

Odpowiedz

6

Musisz zwiększyć swój schemaVersion i dostarczyć migrationBlock na swoim RLMRealmConfiguration. Tam możesz migrować tabele. Ale nie potrzebujesz tego w tym konkretnym przypadku tutaj. Dodawanie właściwości może być obsługiwane automatycznie. Nadal będziesz potrzebował pustego bloku.

let config = RLMRealmConfiguration.defaultConfiguration() 
config.schemaVersion = 1 
config.migrationBlock = { (migration, oldSchemaVersion) in 
    // nothing to do 
} 
RLMRealmConfiguration.setDefaultConfiguration(config) 
+1

Dzięki @marius, Zmieniono mój pełny kod. Czy możesz wskazać mi fałsz? – AJit

+0

Należy jednak pamiętać, że nie wystarczy, aby kolejne zmiany schematu tylko zwiększyły wartość schemaVersion o jeden. Musi być wyższy niż zapisana wersja w bazie danych, więc może być sens przechowywać tam absolutną liczbę. – marius

+0

Jeśli wciąż pracujesz nad rozwojem, prawdopodobnie chcesz zresetować zawartość i ustawienia symulatora zamiast/usunąć aplikację i zacząć od początku. Sprawi to, że będzie o wiele łatwiej, jeśli będziesz martwić się tylko o migracje między wersjami schematu, które zostały faktycznie wdrożone. – marius

Powiązane problemy