在创建新的 Realm 对象时,我需要检查对象是否存在吗?

Do I need to check for object existence when creating new Realm objects?

提问人:gerbil 提问时间:10/25/2023 最后编辑:TylerHgerbil 更新时间:10/26/2023 访问量:62

问:

在使用 Realm 时,我注意到如果我尝试保存一个 ID 已经存在的对象,应用程序会崩溃。

这导致我的代码对于我想要创建的每个 Realm 类型都是这样的:Object

func fetchOrCreate(...) -> MyClass? {
   let existingObject = realm.object(ofType: MyClass.self, forPrimaryKey: MyClass.primaryKeyFor(...))
   let object = existingObject ?? MyClass(with: ...)
   return object
}

用于任何对象的创建。 这似乎是凌乱的样板。每次创建新对象时是否真的需要检查现有对象?

迅捷 领域

评论

1赞 Teja Nandamuri 10/25/2023
这回答了你的问题吗?从 Realm 数据库中检索单个对象的正确方法
0赞 gerbil 10/26/2023
不,因为我知道如何检索。问题是关于创建新对象。每次创建对象时,我是否真的需要检查该对象是否已经存在?
0赞 TylerH 10/26/2023
@gerbil “如果我尝试保存其 ID 已存在的对象,应用程序将崩溃”对您来说是一个问题吗?如果由于 ID 冲突导致崩溃不是问题,则可以跳过检查现有对象。
0赞 Jay 10/27/2023
我发布了一个答案,但有一个后续问题;实际答案将取决于对象的创建方式以及模型是什么。您能否更新您的问题以包括对象模型,然后包括用于实例化和编写这些对象的特定代码?一旦有更多信息,我可能需要更新我的答案。

答:

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

您可以在此处阅读有关它的更多信息: 更新插入对象