Realm <list>已填充但只有一个对象

时间:2015-12-08 16:21:18

标签: ios swift swift2 realm

我第一次使用Realm,我在Swift项目中使用它。我使用的是Realm 0.96.3的最新版本。

我有两个Realm模型: Jog Marker

class RealmCurrentRecJog: Object {

        dynamic var id: Int = 0

        dynamic var duration: Double = 0.0
        let markers = List<RealmCurrentRecMarker>()

        // Specify properties to ignore (Realm won't persist these)

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

class RealmCurrentRecMarker: Object {

    dynamic var order: Int = 0

    dynamic var latitude: Double = 0.0
    dynamic var longitude: Double = 0.0

    dynamic var speed: Double = 0.0
    dynamic var accuracy: Double = 0.0
    dynamic var altitude:  Double = 0.0

    dynamic var time: Double = 0.0
}

正如你在Jog模型中看到的那样,我得到了<List>个标记,id是主键。在Marker模型中没什么可疯狂的。

所以我用这个函数填充我的Realm Models:

private func fillDbWithMarker() {

        let saveJog = RealmCurrentRecJog()
        let saveMarker = RealmCurrentRecMarker()

        let jogToSave = self.jogRecorder.getDraftJog()

        saveJog.id = Int(jogToSave.id)
        saveJog.duration = jogToSave.duration

        saveMarker.order = Int((jogToSave.markers.last?.order)!)
        saveMarker.longitude = (jogToSave.markers.last?.longitude)!
        saveMarker.latitude = (jogToSave.markers.last?.latitude)!

        saveMarker.accuracy = (jogToSave.markers.last?.accuracy)!
        saveMarker.altitude = (jogToSave.markers.last?.altitude)!
        saveMarker.speed = (jogToSave.markers.last?.speed)!
        saveMarker.time = (jogToSave.markers.last?.time)!

        do {
            let realm = try Realm()
            do {
                try! realm.write {
                    saveJog.markers.append(saveMarker)
                    realm.add(saveJog, update: true)
                }
            }
        } catch let error as NSError {
            print(error)
        }
    }

最后,当我查看我的Realm浏览器时,结果是即使我的Marker表已满,我的列表中也有最后一个标记。 我不明白我的错误在哪里。

RealmBrowser

修改:以下是使其正常运行的代码

do {
            let realm = try Realm()
            do {
                try! realm.write {
                    saveJog = realm.objects(RealmCurrentRecJog).last!
                    saveJog.markers.append(saveMarker)
                    realm.add(saveJog, update: true)
                }
            }
        } catch let error as NSError {
            print(error)
        }

1 个答案:

答案 0 :(得分:3)

fillDbWithMarker创建Jog,其markers列表包含单个标记。当它与Realm.add(_:update:)一起保存时,它会使用相同的主键更新现有的Jog,以使其属性与传入的对象的属性相匹配。这会导致现有Jog对象更新为仅包含单个新标记。

如果您调整fillDbWithMarker以检索具有给定ID的现有Jog并将标记附加到其markers列表,您将获得之后的行为