2016-07-24 40 views
2

假設我有:RealmSwift:如何正確創建To-One關係?

class Dog: Object { 
    dynamic var race = "" 
    dynamic var name = "" 

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

class Person: Object { 
    dynamic var name = "" 
    dynamic var address = "" 
    dynamic var dog: Dog? 

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

首先我創建了一個Dog並保存:

let dog = Dog() 
dog.race = "Dalmatian" 

try! realm.write { 
    realm.add(dog, update: true) 
} 

現在,我在不同的類中創建一個Person。這個文檔對這種情況有點不清楚。我是否需要先建立關係?:

let person = Person() 
person.name = "Jim" 

// retrieve dog from realm: 

if let dog = realm.objectForPrimaryKey(Dog.self, key: "Dalmatian") { 
    dog.name = "Rex" // Owner gives dog a new name 

    // Question: 
    // Saving changes to Rex: is this step neccessary? 
    try! realm.write { 
     realm.add(dog, update: true) 
    } 

    person.dog = dog 
} 

try! realm.write { 
    realm.add(person, update: true) 
} 

回答

2

沒有之前保存的Dog的變化,它會導致崩潰

if let dog = realm.objectForPrimaryKey(Dog.self, key: "Dalmatian") { 
    dog.name = "Rex" // Owner gives dog a new name 

    person.dog = dog 
} 

,如果你想更新dogname,這樣寫這樣的:

if let dog = realm.objectForPrimaryKey(Dog.self, key: "Dalmatian") { 

     try! realm.write({ 
      dog.name = "Rex" 
     }) 

     person.dog = dog 

    } 

看多:Realm.io/updating-objects

0

您可以將整個對象圖形設置爲非託管對象,並通過一次調用將其全部保留。所以你不需要先堅持狗,並再次檢索它,以便能夠在關係中使用它。

let dog = Dog() 
dog.race = "Dalmatian" 

let person = Person() 
person.name = "Jim" 
person.dog = dog 

try! realm.write { 
    realm.add(person, update: true) 
} 
+0

Bht有時候這是必要的,因爲我在不同的類中創建它們。 – MJQZ1347