我如何为 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 字段排序通常会导致对象按创建顺序排序。