我如何为 Realm 中的每个新对象获取新的唯一 ID?
How I can get new unique id for each new object in Realm?
我尝试在 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)
}
}
}
但是当我添加第二个新对象时,出现错误:
Terminating app due to uncaught exception 'RLMException', reason:
'Attempting to create an object of type 'Persons' with an existing
primary key value '0'.'
如何为每个新对象获取新的唯一 ID?
你最好的办法是让你的代码为你定义
class PersonClass: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var name = ""
override static func primaryKey() -> String? {
return "id"
}
}
UUID().uuidString returns 一个独特的字符串,非常适合主键。
然而
这将不适用于 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 Getting Started Guide
中阅读更多相关信息
注意在RealmSwift 10.10.0之后,可以使用下面的方法来自动生成objectId
@Persisted(primaryKey: true) var _id: ObjectId
请记住,如果在对象上使用 @Persisted
,则需要使用 @Persisted
[=16] 定义 all Realm 托管属性=]
自从 Realm v10 发布以来,更好的答案是使用专用的新 objectID class
一个 12 字节(可能)的唯一对象标识符。
ObjectId 类似于 GUID 或 UUID,可用于唯一标识对象而无需集中式 ID 生成器。一个 ObjectID 包括:
- 一个 4 字节时间戳,用于测量自 Unix 时代以来 ObjectId 的创建时间(以秒为单位)。
- 一个5字节的随机值
- 一个 3 字节计数器,初始化为一个随机值。
ObjectId 旨在快速生成。按 ObjectId 字段排序通常会导致对象按创建顺序排序。
我尝试在 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)
}
}
}
但是当我添加第二个新对象时,出现错误:
Terminating app due to uncaught exception 'RLMException', reason: 'Attempting to create an object of type 'Persons' with an existing primary key value '0'.'
如何为每个新对象获取新的唯一 ID?
你最好的办法是让你的代码为你定义
class PersonClass: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var name = ""
override static func primaryKey() -> String? {
return "id"
}
}
UUID().uuidString returns 一个独特的字符串,非常适合主键。
然而
这将不适用于 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 Getting Started Guide
中阅读更多相关信息注意在RealmSwift 10.10.0之后,可以使用下面的方法来自动生成objectId
@Persisted(primaryKey: true) var _id: ObjectId
请记住,如果在对象上使用 @Persisted
,则需要使用 @Persisted
[=16] 定义 all Realm 托管属性=]
自从 Realm v10 发布以来,更好的答案是使用专用的新 objectID class
一个 12 字节(可能)的唯一对象标识符。
ObjectId 类似于 GUID 或 UUID,可用于唯一标识对象而无需集中式 ID 生成器。一个 ObjectID 包括:
- 一个 4 字节时间戳,用于测量自 Unix 时代以来 ObjectId 的创建时间(以秒为单位)。
- 一个5字节的随机值
- 一个 3 字节计数器,初始化为一个随机值。
ObjectId 旨在快速生成。按 ObjectId 字段排序通常会导致对象按创建顺序排序。