使用主键检索单个领域对象 - 错误:无效的对象 ID 字符串必须是 24 个十六进制数字

Posted

技术标签:

【中文标题】使用主键检索单个领域对象 - 错误:无效的对象 ID 字符串必须是 24 个十六进制数字【英文标题】:Retrieve a single Realm object using Primary key - Error : Invalid Object ID string must be 24 hex digits 【发布时间】:2021-12-01 07:25:46 【问题描述】:

我正在尝试使用主键获取单个对象,但它永远无法工作并且无法弄清楚我错过了什么

我的Realm数据模型如下

class Chapter : Object 
    @objc dynamic var title = ""
    @objc dynamic var chapterID = 0
    @objc dynamic var bookmark =  0.0
    @objc dynamic var marked = false
    
    
    let notes = List<Notes>()
    
    
    override class func primaryKey() -> String? 
        return "chapterID"
    
 


 func addNote(note: Note, chapterID: Int ) 
        
    objectWillChange.send()
 
    do 
  
      
let chapter = try Realm().object(ofType: Chapter.self, forPrimaryKey: "\(chapterID)")
//  code to append note 


catch let error 
      // Handle error
      print("Error in retrieving chapter no. \(chapterID)")
      print(error.localizedDescription)
    

当我尝试使用 Realm().object(ofType: forPrimaryKey:) 或 Realm realm.object(ofType:forPrimaryKey: 我收到以下错误。例如对于 id 2

无效的对象 ID 字符串“2”:必须是 24 个十六进制数字

感谢任何提示

【问题讨论】:

我知道这里发生了什么,但需要验证一些东西。您可以使用 MongoDB Realm Studio 打开您的 Realm 文件并检查 Chapter 对象,查看 chapterID 属性的列标题吗?我想知道它展示的是什么类型的财产。请务必打开正确的 Realm 文件,因为可能有多个文件。另外,您是否随时遵循入门指南和/或更改您的章节模型? 感谢它显示chapterID int(Primary key) 为清楚起见 - 导致问题的代码未显示在问题中。显示的代码是 writing 到领域,问题是 reading 从领域。 对,代码首先检索(读取)一个对象,然后附加(写入)到对象的注释列表一个注释..错误在检索行中,这就是为什么我没有包含写入代码,因为那里没问题,一旦成功检索到对象,写起来就很简单了 好吧,我的评论完全不清楚,试图增加清晰度。哈哈。我是说这个"\(chapterID)") 将chapterID(一个Int)转换为一个字符串。如果存储在领域中的数据是一个字符串,那么读取它就可以了。更重要的是(题外话)使用 int 作为主键有一些缺点,您可能需要考虑使用 UUID 或 ObjectID 属性类型作为主键。 【参考方案1】:

chapterID 是一个Int,因此当您尝试获取Chapter 时,不应传递String。只需传入一个整数值。

let chapter = try Realm().object(ofType: Chapter.self, forPrimaryKey: chapterID)

根据您使用的 Realm,我会推荐更新的语法:

class Chapter: Object 
    @Persisted var title = ""
    @Persisted(primaryKey: true) var chapterID = 0
    @Persisted var bookmark =  0.0
    @Persisted var marked = false

【讨论】:

现在可以使用了,谢谢

以上是关于使用主键检索单个领域对象 - 错误:无效的对象 ID 字符串必须是 24 个十六进制数字的主要内容,如果未能解决你的问题,请参考以下文章

领域错误:无效值,期望int和接收:0

领域错误:无效值,期待 int 并接收:0

Go语言学习之旅--gorm

Go语言学习之旅--gorm

Go语言学习之旅--gorm

对象名 'dbo.Student' 无效