2015-02-02 1 views
0

Realm을 다운로드하고 RealmExamples 앱을 열었습니다.realmexamples의 소유자 수 변경

RealmExamples의 응용 프로그램은 http://realm.io/docs/cocoa/0.90.4/

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 메소드는 내가 피도 2 개 주인을 얻기 위해 무엇을해야하는지

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 

을 제공합니다.

+0

안녕하세요 cpmac은 모델 설정 방법과 ownerNames에 대한 데이터베이스를 쿼리하는 방법에 대해 좀 더 많은 코드를 공유 할 수 있습니까? – yoshyosh

+0

답장을 보내 주셔서 감사합니다. appdelagate 파일의 전체 코드를 추가했습니다 – cpmac

답변

0

거의 다 알았습니다. 아래의 코드에서는 3 명의 새로운 사람과 3 개의 새 개의 개를 만듭니다.

//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]]]) 
을 생성되는 :

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]]]) 

를이 분해하자이 일의 동일

동등한 것입니까? 이 일을하는 사람 :

개가 같은 이름과 나이를 가지고 있어도 같은 대상 (개)이 아닙니다. firstDog! = secondDog. 나는이 작업을 수행하는 가장 쉬운 방법이

person2.dogs = [firstDog] 

을 대신 이제 첫 번째 사람에 추가 된 동일한 개 객체를 참조 내가 위에서 한 것과 유사한 긴 양식을 작성하는 것입니다 생각합니다.

대체 솔루션 :

이 primaryKeys을 사용 할 수있는 또 다른 방법은, 각각의 개는 고유하며 다른 사람에 추가하기 전에 기본 키에 의해를 가져올 수 있습니다. 이 솔루션은 좀 더 복잡하지만 일반적으로 이러한 종류의 작업을 수행하는 올바른 방법은 더 복잡합니다.

+0

답장을 보내 주셔서 감사합니다 이 코드는 개와 소유자 사이의 유일한 연결이 이름이라는 것을 암시하는 것으로 보입니다. var 소유자 : [Person] { // getter 만 정의되어 있기 때문에 영역이이 속성을 유지하지 않습니다. // Person에 대한 역 관계로 "소유자"를 정의합니다.개 [Person] 다음으로동적 연결 개 = RLMArray (objectClassName : Dog.className())로 linkingObjectsOfClass ("Person", forProperty : "개")를 반환하십시오. – cpmac

+0

Np! 속성 dog는 Person 객체에 저장된 동적 var 개가 있으므로 링크입니다. Dog.className() = "Dog" Dog.className() = dog의 속성 이름 (예 : dog.name)이 잘못되었다고 생각할 수도 있습니다. – yoshyosh

+0

dog.name person.name과 혼동 스럽습니다. 마지막 거래 행을 [ "Colin", [[ "Rex", "Fido", 1]]]으로 바 꾸었습니다. Rex는 1 명의 소유자 ([ "Colin"])를 가지고 있습니다. – cpmac