提问人:gerbil 提问时间:10/25/2023 最后编辑:TylerHgerbil 更新时间:10/26/2023 访问量:62
在创建新的 Realm 对象时,我需要检查对象是否存在吗?
Do I need to check for object existence when creating new Realm objects?
问:
在使用 Realm 时,我注意到如果我尝试保存一个 ID 已经存在的对象,应用程序会崩溃。
这导致我的代码对于我想要创建的每个 Realm 类型都是这样的:Object
func fetchOrCreate(...) -> MyClass? {
let existingObject = realm.object(ofType: MyClass.self, forPrimaryKey: MyClass.primaryKeyFor(...))
let object = existingObject ?? MyClass(with: ...)
return object
}
用于任何对象的创建。 这似乎是凌乱的样板。每次创建新对象时是否真的需要检查现有对象?
答:
0赞
Jay
10/26/2023
#1
您的问题
我真的需要在每次创建对象时检查该对象是否 已存在
或?答案取决于预期结果是什么以及模型的结构。例如,必须有一种方法来确定一个对象是否与另一个对象“相同”,并且成为对象主键。
我相信你要找的是Upsert。如果对象不存在,则插入 Upsert,如果存在,则更新现有对象。更新插入要求模型具有主键。
假设有一个 Person 对象
class Person: Object {
@Persisted(primaryKey: true) var _id = 0
@Persisted var name = ""
}
然后让我们做一个更新插入
//assume a person with _id 1234 exists, read it in
let aPerson = realm.objects(Person.self).where { $0._id == 1234 }
try! realm.write {
//create a new person object but give it the same _id
let p = Person(value: ["_id": 1234, name: "Jay"]
realm.add(p, update: .modified)
}
由于新的 person 对象具有相同的_id,并且我们已经指定了 ,因此 Realm 假定它是同一个人,并将该人的名字更新为 “Jay”。.modified
但是,如果 1234 的_id尚不存在,则将创建一个全新的 person 对象。
如果存在具有该_id的对象,则省略该参数将崩溃 - 如问题中所述。.modified
您可以在此处阅读有关它的更多信息: 更新插入对象
评论