2015-12-16 1 views
3

я следующие моделиВыполните миграцию путем добавления списка() и другая модель класса

class Area: Object { 

// Specify properties to ignore (Realm won't persist these) 

// override static func ignoredProperties() -> [String] { 
// return [] 
// } 

    dynamic var id = 0 
    dynamic var name = "" 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

} 

class Region: Object { 

// Specify properties to ignore (Realm won't persist these) 

// override static func ignoredProperties() -> [String] { 
// return [] 
// } 

    dynamic var id = 0 
    dynamic var name = "" 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

} 

И я хотел бы добавить let areas = List<Area>() к классу Региона и dynamic var region: Region? к классу Area, могу ли я спросить, как выполнить миграцию блок? Причина того, что пример в документации по миграции демонстрирует только примитивные типы.

ответ

0

Отредактировано После приема Разъяснение

Alrighty. Поэтому, поскольку вы хотите предварительно заполнить areas, когда вы добавите его в свою модель, в конце концов вам понадобится реализовать некоторую логику в вашем блоке миграции.

let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in 
    migration.enumerate(Region.className()) { oldObject, newObject in 
     if oldSchemaVersion < 1 { 
      let areas = newObject?["areas"] as? List<MigrationObject 
      // Add new objects to 'areas' as needed 
     } 
    } 
} 

Там в some sample code, показывающий, как обрабатывать объекты списка в миграции в Realm коллекции образцов коды Свифта

Если ваша цель в добавлении region свойства Area поэтому вы можете выяснить, какой Region объекта этого Area является child of, то вам не нужно реализовывать это как свойство модели. Вместо этого вы можете использовать linkingObjects(_: forProperty:), чтобы заставить Realm работать от вашего имени.

class Area: Object { 
    dynamic var id = 0 
    dynamic var name = "" 
    var regions: [Region] { 
     return linkingObjects(Region.self, forProperty: "areas") 
    } 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

Чтобы подтвердить, что я сказал в комментариях, миграции являются односторонним путем. Они не могут быть понижены до предыдущих версий схемы. Если вы хотите быстро отладить процесс миграции в файле Realm, я рекомендую отложить исходный файл Realm и работать с копиями.


Оригинал ответа

ли вы на самом деле есть какие-либо данные, которые вы хотите добавить эти новые свойства? Поскольку это не похоже на то, что вам нужно, вам не нужно выполнять какой-либо код в блоке миграции.

Просто увеличьте номер версии схемы Realm и поставьте пустой блок миграции.

let config = Realm.Configuration(
    schemaVersion: 1, 
    migrationBlock: { migration, oldSchemaVersion in 

}) 

Realm.Configuration.defaultConfiguration = config 

В то время как блок миграции не может быть нулевым, вам нужно всего лишь поместить код там, если есть какие-либо данные в старом файле Realm, который вы хотите управлять во время миграции (то есть, перемещая его в другое имущество). Если вы добавляете новые свойства, нет необходимости делать что-либо им внутри блока миграции.

Требуется некоторое время, чтобы проникнуть в мышление миграции Царства, но, к счастью, как только вы это сделаете, вы поймете, что они легче, чем вы думали. :)

(Отказ от ответственности: Я работаю в Realm, но я использую его в одном из своих приложений iOS для доставки, где я играл с несколькими миграциями на реальных пользовательских данных на этом этапе.:))

+0

Я действительно Вот почему я спрашиваю: «Как мне отлаживать мою миграцию btw? Как если бы моя схема уже была версией 1, как мне вернуться к версии 0, чтобы проверить мою схему схемы 1» – Happiehappie

+0

И вам не нужны блоки записи внутри миграция? @ _ @ – Happiehappie

+0

Причина У меня на самом деле есть класс Outlet, который имеет как область, так и область, то, что я пытаюсь сделать, теперь связывает их обоих. – Happiehappie

0

Вот возможное решение, воображая, что более старой версии, схема была 0, и новый 1:

let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in 

    if oldSchemaVersion < 1 { 
    //Migrate Regions 
    migration.enumerate(Region.className()) { oldObject, newObject in 
     if oldSchemaVersion < 1 { 

     //Get appropriate area object for this Region Object 
     let area = areaForRegion(newObject) //<-- implement this 
     newObject.areas.append(area) 
     } 
    } 

    //Migrate areas 
    migration.enumerate(Area.className()) { oldObject, newObject in 
     if oldSchemaVersion < 1 { 

     //Get appropriate region object for this area Object and set up the relation 
     let region = regionForArea(newObject) //<-- implement this 
     newObject.region = region 
     } 
    } 

    } 
    print("Migration complete.") 
} 

Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 1, migrationBlock: migrationBlock) 

// print out all migrated objects in the default realm 
// migration is performed implicitly on Realm access 
print("Migrated Area objects in the default Realm: \(try! Realm().objects(Area))") 
print("Migrated Region objects in the default Realm: \(try! Realm().objects(Region))") 

Примечание: Вам нужно будет реализовать методы, которые возвращают вам область для данного региона и наоборот.

+0

Извините, что я очень молод, как вы можете знать. Но где я могу реализовать регион для области и области для региона? – Happiehappie

+0

Могу ли я просто определить их как ... скажем, в случае с строкой "" (пустое значение)? – Happiehappie

+0

Уверенный, вы можете иметь область в области как необязательную, и просто установите значение nil во время миграции на него. И если у вас еще нет какой-либо области для добавления, вы можете удалить код миграции для класса Region. – Shripada

Смежные вопросы