如何为Realm中的每个新对象获取新的唯一id



我尝试在Realm中创建具有唯一id的对象。我使用以下代码:

class Persons: Object {
@objc dynamic var id = 0
@objc dynamic var name = ""
override static func primaryKey() -> String? {
return "id"
}
}

在我的StorageManager中,我使用以下代码:

import RealmSwift
let realm = try! Realm()
class StorageManager {
static func saveObject(_ person: Persons) {
try! realm.write {
realm.add(person)
}
}

static func deleteObject(_ person: Persons) {
try! realm.write {
realm.delete(person)
}
}
}

但当我添加第二个新对象时,我会得到错误:

由于未捕获的异常"RLMException"而终止应用程序,原因:'正在尝试使用现有的主键值"0">

如何为每个新对象获取新的唯一id?

您最好的选择是让您的代码为您定义

class PersonClass: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var name = ""
override static func primaryKey() -> String? {
return "id"
}
}

UUID((.uuidString返回一个唯一的字符串,该字符串非常适合主键。

无论如何

这在未来不会适用于Realm Sync。MongoDB Realm是新产品,对象需要有一个名为_id的特定主键属性,该属性应该用Realm ObjectID属性填充。因此,如果你想在未来兼容,这会更好

class PersonClass: Object {
@objc dynamic var _id = ObjectId()
@objc dynamic var name = ""
override static func primaryKey() -> String? {
return "_id"
}
}

您可以在MongoDB Realm入门指南中阅读更多信息

请注意,在RealmSwift 10.10.0之后,以下内容可以用于自动生成objectId

@Persisted(primaryKey: true) var _id: ObjectId

请记住,如果在对象上使用@Persisted,则所有Realm管理的属性都需要使用@Persisted进行定义

注意,如果使用@Persisted,则不需要override static func primaryKey()函数

自从Realm v10问世以来,更好的答案是使用专用的新objectID类

一个12字节(可能(的唯一对象标识符

ObjectId类似于GUID或UUID,可以在没有集中式ID生成器的情况下用于唯一标识对象。ObjectID包括:

  • 一个4字节的时间戳,用于测量自Unix epoch以来ObjectId的创建时间(以秒为单位(
  • 一个5字节的随机值
  • 一个3字节的计数器,初始化为一个随机值

ObjectId旨在快速生成。按ObjectId字段排序通常会导致按创建顺序对对象进行排序

最新更新