我第一次使用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表已满,我的列表中也有最后一个标记。 我不明白我的错误在哪里。
修改:以下是使其正常运行的代码
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)
}
答案 0 :(得分:3)
fillDbWithMarker
创建Jog
,其markers
列表包含单个标记。当它与Realm.add(_:update:)
一起保存时,它会使用相同的主键更新现有的Jog
,以使其属性与传入的对象的属性相匹配。这会导致现有Jog
对象更新为仅包含单个新标记。
如果您调整fillDbWithMarker
以检索具有给定ID的现有Jog
并将标记附加到其markers
列表,您将获得之后的行为