在快速领域中链接对象的问题

时间:2016-04-24 18:20:22

标签: swift realm

我在领域中链接对象时遇到问题。我阅读了题为“境界中的嵌套对象”的问题和答案,并尝试了建议的答案,但它对我不起作用。

以下是我的对象类:

import Foundation
import RealmSwift

class Job: Object {
    dynamic var id = NSUUID().UUIDString
    dynamic var name = ""
    dynamic var address = ""
    dynamic var phone = ""
    dynamic var email = ""
    dynamic var notes = ""
    dynamic var material = 0.0
    dynamic var edge = 0.0
    dynamic var splash = 0.0
    dynamic var discount = 0.0
    dynamic var trip = 0.0
    let rooms = List<Room>()

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

import Foundation
import RealmSwift

class Room: Object {
    dynamic var id = NSUUID().UUIDString
    dynamic var name = ""
    dynamic var material = 0.0
    dynamic var edge = 0.0
    dynamic var splash = 0.0
    dynamic var sinkType = ""
    dynamic var sinkModel = ""
    dynamic var numberOfSinks = 0
    dynamic var faucet = ""
    dynamic var rangeType = ""
    dynamic var notes = ""
    dynamic var jobs: Job?
    let countertops = List<Countertop>()
    //var linksToJob: [Job] {
    //    return linkingObjects(Job.self, forProperty: "rooms")
    //}

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

}

import Foundation
import RealmSwift

class Countertop: Object {
    dynamic var id = NSUUID().UUIDString
    dynamic var depth = 0.0
    dynamic var width = 0.0
    dynamic var cabDescription = ""
    dynamic var sqFt = 0.0
    dynamic var room: Room?
    //var linkToRoom: [Room] {
    //    return linkingObjects(Room.self, forProperty: "countertops")
    //}
    override static func primaryKey() -> String {
        return "id"
    }
}

以下是我用来保存数据的函数:

 @IBAction func saveButton() {
    jobs.name = nameTF.text!
    jobs.address = addressTF.text!
    jobs.phone = phoneTF.text!
    jobs.email = emailTF.text!
    jobs.notes = notesTV.text!
    jobs.discount = Double(discountTF.text!)!
    jobs.material = Double(materialTF.text!)!
    jobs.edge = Double(edgeTF.text!)!
    jobs.splash = Double(splashTF.text!)!
    jobs.trip = Double(tripTF.text!)!
    do {
        try! realm.write {
            realm.add(jobs)
        }
    }

   print(jobs)
 //   print(Realm.Configuration.defaultConfiguration.path!)

}
func saveData(){
    rooms.name = nameTF.text!
    rooms.material = Double(materialTF.text!)!
    rooms.edge = Double(edgeTF.text!)!
    rooms.splash = Double(splashTF.text!)!
    rooms.notes = notesTV.text
    rooms.sinkType = sinkTypeTF.text!
    rooms.sinkModel = sinkModelTF.text!
    rooms.numberOfSinks = Int(numberSinksTF.text!)!
    rooms.faucet = faucetTF.text!
    rooms.rangeType = rangeTF.text!
    rooms.jobs?.id = keyValueLabel.text!
    //rooms.linksToJob

    do {
        try! realm.write {
            realm.add(rooms)
        }
    }

    print(rooms)
}

    @IBAction func addNextButton(sender: AnyObject) {

      //  self.realm.beginWrite()
        let realm = try! Realm()


        if widthTF.text != "" {
            Calculations.depth = Double(depthTF.text!)!
            Calculations.width = Double(widthTF.text!)!

            let depthAdded = depthTF.text
            cabinetDepth.append(Double(depthAdded!)!)


            let widthAdded = widthTF.text
            cabinetWidth.append(Double(widthAdded!)!)


            let descriptionAdded = pickerLabel.text
            cabinetDescription.append(descriptionAdded!)

            let runningTotal = Calculations.squareFeet()
            squareFeetToBeAdded.append(runningTotal)

            let sum = squareFeetToBeAdded.reduce(0,combine: {$0 + $1})

            let roundedSqFt = Double(round(sum * 10) / 10)

            sqFtLabel.text = "\(roundedSqFt)"

            countertops.depth = Double(depthTF.text!)!
            countertops.width = Double(widthTF.text!)!
            countertops.cabDescription = pickerLabel.text!
            countertops.sqFt = Double(sqFtLabel.text!)!
            //countertops.linkToRoom

            do {
                try realm.write {
                    realm.add(countertops)
                }
                print(countertops)
            } catch {
                print("an error occurred")
            }


            widthTF.text = ""

            numberTable.reloadData()
            widthTF.becomeFirstResponder()

        }
    }

当我保存数据并打印结果时,我得到的是:

Job {
    id = 00F95F55-54D8-426E-B483-C990A4171002;
    name = Ken;
    address = Address;
    phone = phone;
    email = email;
    notes = Notes :;
    material = 8;
    edge = 0;
    splash = 4;
    discount = 1;
    trip = 0;
    rooms = RLMArray <0x7ffef9df29c0> (

    );
}
Room {
    id = 7D3F86B9-FCD7-4CB7-AD6E-9B8141A7390C;
    name = Kitchen;
    material = 9;
    edge = 0;
    splash = 4;
    sinkType = Undermount Kitchen;
    sinkModel = 50/50 Stainless Steel;
    numberOfSinks = 1;
    faucet = Single Hole;
    rangeType = Free Standing Range;
    notes = Notes:;
    jobs = (null);
    countertops = RLMArray <0x7ffef9df3720> (

    );
}

Countertop {
    id = 992B8BAE-392F-4513-85DC-CBA191D2AE08;
    depth = 25.5;
    width = 65;
    cabDescription = Cabinet;
    sqFt = 11.5;
    room = (null);
}

如您所见,链接返回null。 请告诉我这里我做错了什么。 注意:我注释掉了模型中的linkingObjects,因为它导致了崩溃。我不确定为什么。

3 个答案:

答案 0 :(得分:1)

添加时,应该使用对现有领域对象的引用。所以不是这样:

func saveData(){
    rooms.name = nameTF.text!
    rooms.material = Double(materialTF.text!)!
    rooms.edge = Double(edgeTF.text!)!
    rooms.splash = Double(splashTF.text!)!
    rooms.notes = notesTV.text
    rooms.sinkType = sinkTypeTF.text!
    rooms.sinkModel = sinkModelTF.text!
    rooms.numberOfSinks = Int(numberSinksTF.text!)!
    rooms.faucet = faucetTF.text!
    rooms.rangeType = rangeTF.text!
    rooms.jobs?.id = keyValueLabel.text!
    //rooms.linksToJob

    do {
        try! realm.write {
            realm.add(rooms)
        }
    }

    print(rooms)
}

您可以使用以下内容:

let realm = try! Realm()
let room = realm.create(Room.self)
room.name = nameTF.text!
room.material = Double(materialTF.text!)!
...
let job = realm.create(Job.self)
job.name = "My job name"
...
room.job = job

由于您在单独的屏幕上输入这些内容,您将添加一个房间,然后您想要添加一个作业:

if let existingJob = realm.objects(Job).filter("name == '\(jobNameToLookup)'").first {
  room.job = existingJob
}

对于列表,只需要做room.countertops.append(newCountetop),其中newCountertop是realm.create的结果

答案 1 :(得分:0)

因为您可以单独将每个对象添加到Realm中而无需链接。如果您要关联对象,则应将对象添加到List属性,例如roomscountertops。对于一对一的关系,您应该将对象分配给属性。

所以你需要编写如下代码:

...
rooms.faucet = faucetTF.text!
rooms.rangeType = rangeTF.text!
...
rooms.countertops.append(countertops)
...
jobs.rooms.append(rooms)

...
countertops.rooms = rooms
...
rooms.jobs = jobs

有关详细信息,另请参阅文档:

答案 2 :(得分:0)

感谢奥斯汀让我走上正轨。这是最终完成它的代码。

  @IBAction func roomSaveNextBtnPushed(_ sender: UIButton) {
    let room = Room()
    room.roomName = roomTF.text!
    room.material = materialTF.text!
    room.edge = edgeTF.text!
    room.job = realm.objects(Job.self).last
    try! realm.write {
        realm.add(room)
        print(room)
    }
}

链接是在&#39; realm.object(Job.self).last&#39;代码行。这为预期的工作增加了一个空间。

奥斯汀的例子中的建议&#39;让room = realm.create(Room.self)&#39;导致错误,项目无法编译。

我正在使用Xcode 8和Swift 3以及Realm-swift 1.1.0

再次感谢那些提供帮助的人。