使用主键检索单个领域对象 - 错误:无效的对象 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 个十六进制数字的主要内容,如果未能解决你的问题,请参考以下文章