我尝试在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字段排序通常会导致按创建顺序对对象进行排序