swift 如何为Realm中的每个新对象获取新的唯一ID?

um6iljoc  于 2022-12-10  发布在  Swift
关注(0)|答案(2)|浏览(222)

我尝试在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”的“Persons”类型的对象。
如何为每个新对象获取新的唯一ID?

aemubtdh

aemubtdh1#

最好的办法是让代码为您定义它

class PersonClass: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var name = ""

    override static func primaryKey() -> String? {
        return "id"
    }
}

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

但是

MongoDB领域是新产品,对象需要有一个名为_id的特定主键属性,该属性应该用领域ObjectID属性填充。

class PersonClass: Object {
    @objc dynamic var _id = ObjectId()
    @objc dynamic var name = ""

    override static func primaryKey() -> String? {
        return "_id"
    }
}

您可以在MongoDB领域入门指南中阅读更多相关内容
请注意,在RealmSwift 10.10.0之后,可以使用以下代码自动生成objectId

@Persisted(primaryKey: true) var _id: ObjectId

请记住,如果在对象上使用@Persisted,则需要使用@Persisted定义“所有”领域托管属性
请注意,如果使用@Persisted,则不需要override static func primaryKey()函数

fcg9iug3

fcg9iug32#

自从Realm v10问世以来,更好的解决方案是使用专用的新objectID class

  • 一个12字节(可能是)的唯一对象标识符。*
  • ObjectId类似于GUID或UUID,可用于唯一标识对象,而无需集中ID生成器。ObjectID由以下内容组成:*
    • 一个4字节的时间戳,用于度量自Unix纪元以来ObjectId的创建时间(以秒为单位)。*
    • 5字节随机值 *
    • 3字节计数器,初始化为随机值。*
  • ObjectId旨在快速生成。按ObjectId字段排序通常会导致对象按创建顺序排序。*

相关问题