【问题标题】:Realm one to many relationship only working one sided in Swift 3 for iOS领域一对多关系仅在适用于 iOS 的 Swift 3 中起作用
【发布时间】:2017-04-26 09:05:33
【问题描述】:

我有两个具有一对多关系的不同类:

class Car: Object {
    dynamic var Id = NSUUID().uuidString
    dynamic var Name : String = ""
    dynamic var FuelCapacity : Int = 0

    let FuelRecords = List<FuelRecord>()


    override class func primaryKey() -> String? {
        return "Id"
    }


}

class FuelRecord: Object {

    dynamic var Odometer : Float = 0.0
    dynamic var LiterPrice : Float = 0.0
    dynamic var Date = NSDate()
    dynamic var CarObject : Car?

}

保存 FuelRecord 对象时,Fuelrecord 正在链接到 Car,但是 CarObject 没有链接到 FuelRecord。

如您所见,汽车与 0 FuelRecords 相关联

Click here to view Cars Table in Realm Browser

但 FuelRecord 包含 Car 引用

Click here to view FuelRecords Table in Realm Browser

由于这个问题,我无法获取特定汽车的燃油记录。

这就是我将 FuelRecord 保存到数据库的方式。

fuelRecord.LiterPrice = Float(txtLiterPrice.text!)!
fuelRecord.Odometer = Float(txtOdometer.text!)!
fuelRecord.Total = Float(txtTotal.text!)!
fuelRecord.Volume = Float(txtVolume.text!)!
fuelRecord.IsPartial = switchPartial.isOn




let realm = try! Realm()

try! realm.write{
realm.add(fuelRecord)

谢谢!

【问题讨论】:

  • 你能发布你如何保存fuelRecord对象吗?在此函数中,您还应该将 FuelRecord 保存在 CarObject 列表中
  • fuelRecord.LiterPrice = Float(txtLiterPrice.text!)! fuelRecord.Odometer = Float(txtOdometer.text!)! fuelRecord.Total = Float(txtTotal.text!)! fuelRecord.Volume = Float(txtVolume.text!)! fuelRecord.IsPartial = switchPartial.isOn let realm = try! Realm() try! realm.write{ realm.add(fuelRecord)
  • 因为我认为您没有将 FuelRecord 保存在 Car 对象中,所以您需要创建一个函数,在每次创建 FuelRecord 后将 FuelRecord 添加到 CarObject 中。这不是由 Realm 自己完成的。您需要实现此行为。
  • 你能用代码指导我吗?我的意思是你能帮我写下这段代码吗?

标签: ios swift xcode swift3 realm


【解决方案1】:

一对多关系是单向的。要自动查找与汽车关联的所有 FuelRecords,从而使关系成为双向关系,您应该使用反向关系。这可以通过 LinkingObjects 来实现。

将 Car 类中的 FuelRecords 声明更改为以下内容:

let FuelRecords = LinkingObjects(fromType: FuelRecord.self, property: "CarObject")

遗憾的是,Realm Browser 仍然不会向您显示反向关系(至少对我来说是这种情况),但您将能够从代码中查询与汽车相关的所有 FuelRecords。

【讨论】:

    【解决方案2】:

    在您的代码中,缺少将 CarObject 插入 FuelRecord 对象的部分。顺便说一句:我会在 Car 类中实现一个方法:

    class Car: Object {
       func addFuelRecordToCar(record : FuelRecord) {
          self.FuelRecords.append(record)
       }
    }
    

    在此之后,每当您创建燃料记录时:

    fuelRecord.LiterPrice = Float(txtLiterPrice.text!)!
    fuelRecord.Odometer = Float(txtOdometer.text!)!
    fuelRecord.Total = Float(txtTotal.text!)!
    fuelRecord.Volume = Float(txtVolume.text!)!
    fuelRecord.IsPartial = switchPartial.isOn
    
    // You missed how you insert the CarObject inside your FuelRecord
    // I guess it's something like this
    fuelRecord.CarObject = car
    
    /* insert here */
    
    let realm = try! Realm()
    
    try! realm.write{
    realm.add(fuelRecord)
    

    在右侧插入以下代码:

    car.addFuelRecordToCar(record: fuelRecord)
    

    这应该可行。让我知道:)

    【讨论】:

    • 所以每次我都必须获取特定汽车的所有燃料记录,更新它们,然后将汽车对象重新保存到数据库中?
    • 通过更新它们意味着更改它们相关的 ObjectCar?在这种情况下,是的,您需要手动从 Car 对象中删除 FuelRecord,并更新对汽车的 FuelRecord 引用。我认为这是多余的,您需要决定将 FuelRecord 放在 Car 对象中(在列表中)还是在 FuelRecord 对象中有链接(对 Car 对象的引用)
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多