2015-02-02 3 views
0

Я загрузил Realm и открыл приложение RealmExamples.Изменение количества владельцев в realmexamples

приложение RealmExamples входит в вниз нагрузки от http://realm.io/docs/cocoa/0.90.4/

Попытка добавить владельца, чтобы получить распечатку, чтобы дать больше, чем 1. Кроме того, добавлен возраст распечатать

println("\(dog.name) has \(ownerNames.count) owners (\(ownerNames)) is \(dog.age) years old") 

I добавил собаку и владельца и дал одной собаке двух хозяев, но печать дает всего 1 владелец дважды.

import UIKit 
import Realm 

class Dog: RLMObject { 
    dynamic var name = "" 
    dynamic var age = 0 
    var owners: [Person] { 
     // Realm doesn't persist this property because it only has a getter defined 
     // Define "owners" as the inverse relationship to Person.dogs 
     return linkingObjectsOfClass("Person", forProperty: "dogs") as [Person] 
    } 
} 

class Person: RLMObject { 
    dynamic var name = "" 
    dynamic var dogs = RLMArray(objectClassName: Dog.className()) 
} 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
    self.window!.rootViewController = UIViewController() 
    self.window!.makeKeyAndVisible() 

    NSFileManager.defaultManager().removeItemAtPath(RLMRealm.defaultRealmPath(), error: nil) 

    let realm = RLMRealm.defaultRealm() 
    realm.transactionWithBlock { 
     Person.createInRealm(realm, withObject: ["John", [["Fido", 1]]]) 
     Person.createInRealm(realm, withObject: ["colin", [["Fido", 1]]]) 
     Person.createInRealm(realm, withObject: ["colin", [["simba", 3]]]) 
    } 

    // Log all dogs and their owners using the "owners" inverse relationship 
    let allDogs = Dog.allObjects() 
    for dog in allDogs { 
     let dog = dog as Dog 
     let ownerNames = dog.owners.map { $0.name } 
     println("\(dog.name) has \(ownerNames.count) owners \(ownerNames) is \(dog.age) years old") 
    } 
    return true 
} 

}

Println дает

Fido has 1 owners ([John]) is 1 years old 
Fido has 1 owners ([colin]) is 1 years old 
simba has 1 owners ([colin]) is 3 years old 

, что я должен сделать, чтобы получить Fido имеет 2 владельцев.

+0

Привет, cpmac, вы можете поделиться немного больше кода о том, как настроены ваши модели и как вы запрашиваете базу данных для имен владельцев? – yoshyosh

+0

Спасибо за ответ. Я добавил полный код файла appdelagate – cpmac

ответ

0

Вы почти получили его. В этом коде ниже вы создаете 3 новых человека и 3 новых собак.

realm.transactionWithBlock { 
    Person.createInRealm(realm, withObject: ["John", [["Fido", 1]]]) 
    Person.createInRealm(realm, withObject: ["colin", [["Fido", 1]]]) 
    Person.createInRealm(realm, withObject: ["colin", [["simba", 3]]]) 
} 

Давайте разберем это вниз

Person.createInRealm(realm, withObject: ["John", [["Fido", 1]]]) 

Является эквивалентом сделать это:

//Creating our first person and dog relationship 
let firstDog = Dog() 
firstDog.name = "Fido" 
firstDog.age = 1 

let person1 = Person() 
person1.name = "John" 
person1.dogs = [firstDog] 

Теперь мы смотрим в следующий Человек и собака отношения создается

//Your original code 
Person.createInRealm(realm, withObject: ["colin", [["Fido", 1]]]) 

Является эквивалентом o f делает это:

//Creating our second person and dog relationship 
let secondDog = Dog() 
secondDog.name = "Fido" 
secondDog.age = 1 

let person2 = Person() 
person2.name = "colin" 
person2.dogs = [secondDog] 

Таким образом, хотя собаки имеют одинаковое имя и возраст, они не являются одним и тем же объектом (собакой). firstDog! = secondDog. Я думаю, что самый простой способ сделать это, чтобы написать длинную форму, похожую на то, что я сделал выше, и вместо того, чтобы сделать это

person2.dogs = [firstDog] 

Теперь, относится к тому же объекту собаки, которая была добавлена ​​к первому лицу.

Альтернативное решение:

Другой способ сделать это состоит в использовании primaryKeys, так что каждая собака уникальна, и вы можете получить их PrimaryKey перед добавлением их к другому человеку. Это решение немного более активно, но обычно это правильный способ выполнять эти операции, поскольку они становятся более сложными.

+0

Спасибо за ответ Этот код подразумевает, что единственная связь между собакой и владельцем - это имя. var owner: [Person] { // Realm не сохраняет это свойство, поскольку он имеет только определенный getter // Определите «владельцев» как обратное отношение к Person.собаки return linkingObjectsOfClass («Person», forProperty: «dogs») as [Person] then dynamic var dogs = RLMArray (objectClassName: Dog.className()) – cpmac

+0

Np! Собственность собак является ссылкой, поскольку у вас есть сохраненные отношения динамических собак var на объекте Person. Dog.className() = "Собака". Возможно, вы ошибаетесь, так как Dog.className() = имя свойства на собаке (т. Е. Имя собаки), что было бы неверно. – yoshyosh

+0

Сложно с именем dog.name person.name. Я изменил последнюю строку транзакции на [«Колин», [[«Рекс», 3] [«Фидо», 1]]], который напечатал четвертую строчку - у Рекса 1 владелец ([«Колин»]). – cpmac

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

  • Нет связанных вопросов^_^