Swift关系领域无添加行

时间:2019-05-21 17:14:54

标签: swift realm

我正在建立具有一对多关系的应用程序。我不能在课堂上添加行。

class Bank : Object {

    @objc dynamic var id = 0
    @objc dynamic var allCash = 0
    let persons = List<Person>()

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

}

class Person : Object {

    @objc dynamic var id = 0
    @objc dynamic var cash = 0

    let parent = LinkingObjects(fromType: Bank.self, property: "person")

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

    }

    func incrementID() -> Int {
        let realm = try! Realm()
        return (realm.objects(TransactionType.self).max(ofProperty: "id") as Int? ?? 0) + 1
    }

}

保存日期为基础

lat bank = Bank()
let persons = bank.persons
let parent = realm.objects(Bank.self).first!

try! realm.write {
    for person in persons {
        let newPerson = Person()
        newPerson.cash = person[cashTextField.text!] as! Int
        newPerson.id = person.incrementId()
        realm.add(newPerson)
        parent.persons.append(newPerson)   
    }    
}

当我按下按钮时,没有错误,也没有添加行。我也尝试了这种语法,但看到的行却没有任何关系。

try! realm.write {
        let newPerson = Person()
        newPerson.cash = Int(cashTextField.text!)
        realm.add(newPerson)
}

1 个答案:

答案 0 :(得分:1)

您问题中的代码确实相距不远,因此我们将对其稍加整理,以助您一臂之力。

首先,让我们定义客户和银行类别

class CustomerClass: Object {
    @objc dynamic var customer_id = NSUUID().uuidString
    @objc dynamic var cash = 0.0
    let parent = LinkingObjects(fromType: BankClass.self, property: "customerList")

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

class BankClass: Object {
    @objc dynamic var bank_id = NSUUID().uuidString
    @objc dynamic var cash_balance = 0.0
    let customerList = List<CustomerClass>()

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

如您所见,存在一种定义为多对多的关系;银行可以有多个客户,一个客户可以有多个银行。在这种情况下该方法有效,并且可以让您将客户添加到银行并自动创建反向关系。

然后是将客户添加到列表中第一家银行的功能。如果您要过滤多个银行,以获取要向其添加客户的银行,但是在此示例中,我们仅假设只有一个银行

func addCustomerToFirstBank() {
    if let realm = gGetRealm() {
        let bankResults = realm.objects(BankClass.self)
        if let firstBank = bankResults.first {
            let customerToAdd = CustomerClass()
            customerToAdd.cash = 50
            try! realm.write {
                firstBank.customerList.append(customerToAdd)
            }
         }
    }
}

需要注意的几件事:

为简便起见,当调用gGetRealm()时,我们有一个单例返回一个领域

我们正在使用一种技术,其中swift将为每个银行和客户创建唯一的标识符作为其ID。 id的关键是它必须是唯一的,但实际上并不重要,因此如果您更愿意使用递增索引,也可以。