【问题标题】:How I can get new unique id for each new object in Realm?如何为 Realm 中的每个新对象获取新的唯一 ID?
【发布时间】:2020-11-23 17:10:29
【问题描述】:

我尝试在 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”而终止应用程序,原因: '尝试使用现有的“Persons”类型创建对象 主键值'0'。'

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

【问题讨论】:

    标签: swift realm


    【解决方案1】:

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

    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 Getting Started Guide了解更多信息

    注意,RealmSwift 10.10.0 之后,可以使用以下方式自动生成objectId

    @Persisted(primaryKey: true) var _id: ObjectId
    

    请记住,如果在对象上使用@Persisted,则所有领域托管属性都需要使用@Persisted定义

    【讨论】:

    • 另请注意,Realm 不会自动生成 ObjectId,我们需要在创建时使用 ObjectId.generate() 为每个对象生成一个新 ID。
    • @Ben 感谢您的评论! ObjectId.generate()10.10.0 中被贬值了,因为它会导致 ObjectId 在不使用时生成。从这篇文章开始,我们现在可以将以下内容用作主键 @Persisted(primaryKey: true) var _id: ObjectId。我用更多最新信息更新了答案 - 非常感谢。
    【解决方案2】:

    自从 Realm v10 出来后,更好的答案是使用专用的新 objectID class

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

    ObjectIds 类似于 GUID 或 UUID,无需集中式 ID 生成器即可用于唯一标识对象。一个 ObjectID 包括:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多