当我在 lldb 中“po”核心数据对象时,x-coredata 路径是啥意思?

Posted

技术标签:

【中文标题】当我在 lldb 中“po”核心数据对象时,x-coredata 路径是啥意思?【英文标题】:What does the x-coredata path mean when I 'po' the core data object in lldb?当我在 lldb 中“po”核心数据对象时,x-coredata 路径是什么意思? 【发布时间】:2014-01-10 08:53:49 【问题描述】:

当我在 lldb 中打印核心数据对象的对象描述时,有时会得到以下对象描述:

(lldb) po my_challenge_object (实体:挑战;ID:0x170433460 x-coredata:///Challenge/t52BD558C-A8FE-4064-A8BE-217A837521E52>;数据:...)

如果我稍后打印同一个对象,我有时会看到“x-coredata”路径发生变化。

(实体:挑战;id:0x170433460 x-coredata://50232AB5-7372-4628-9F00-51BDB1A5C96D/Challenge/t52BD558C-A8FE-4064-A8BE-217A837521E52>;数据: ...)

我的问题是,这条路径是什么意思,为什么会发生变化?在这种情况下,添加“50232AB5-7372-4628-9F00-51BDB1A5C96D”可以告诉我关于我的对象的什么信息?

【问题讨论】:

【参考方案1】:

当您第一次打印对象时,它还没有被分配到持久存储区:

(lldb) po my_challenge_object
<Challenge: 0x1700da1d0> (entity: Challenge; id: 0x170433460 <x-coredata:///Challenge/t52BD558C-A8FE-4064-A8BE-217A837521E52> ; data: ...)

这就是托管对象 ID 中冒号后面有三个斜线的原因。

在第二个实例中,它已分配给标识符为“50232AB5-7372-4628-9F00-51BDB1A5C96D”的持久存储。

<Challenge: 0x1700da1d0> (entity: Challenge; id: 0x170433460 <**x-coredata://50232AB5-7372-4628-9F00-51BDB1A5C96D/Challenge/t52BD558C-A8FE-4064-A8BE-217A837521E52**> ; data: ...)

一个托管对象ID URI的结构一般如下:

x-coredata://[Store UUID]/[Entity Name]/[Primary Key]

注意: [Primary Key] 部分是特定于存储的,可能指的是 sqlite 行的 pk 或 XML 或二进制存储中的某些其他标识符。

商店的 UUID 可从商店的元数据字典中获得,或者通过向 NSPersistentStore 的实例询问其标识符来获得:

NSLog(@"Store Identifier: %@", [store identifier]);

【讨论】:

您知道任何深入研究这些数据的技术吗?【参考方案2】:

每个NSManagedObject 都有一个objectID。 您在对象描述中看到的是

[[object objectID] URIRepresentation]

来自objectID的文档:

重要提示:如果尚未保存接收者,则对象 ID 为 保存对象时将更改的临时值。

并来自“核心数据编程指南”:

NSManagedObjectID 对象是托管对象的通用标识符 对象,并为核心数据框架中的唯一性提供基础。一种 托管对象 ID 唯一标识同一托管对象 在单个应用程序中的托管对象上下文之间,以及在 多个应用程序(如在分布式系统中)。和初级一样 数据库中的键,标识符包含所需的信息 准确描述持久存储中的对象,尽管 详细信息不公开。框架完全 封装“外部”信息并呈现干净的对象 面向界面。

您真正需要托管对象 ID 的一种情况是在传递 托管对象从一个托管对象上下文到不同的上下文。

【讨论】:

所以,听起来如果我还没有保存对象,则 URIRepresentation 不应该改变。如果是这样的话,我对 URIRepresentation 发生变化的原因感到困惑。 @kross:这是个好问题。再次查看您的问题,两个对象 ID 看起来都像 临时 ID(比较 ***.com/questions/15354485/… 以分析永久 ID),但实际上我还没有看到像第二个这样的 ID。中间的对象“发生”了什么?你使用嵌套上下文吗? - 另一方面,确切的表示应该无关紧要,也没有记录。

以上是关于当我在 lldb 中“po”核心数据对象时,x-coredata 路径是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 6 beta 5 中使用“po”命令调试选定视图

ios逆向过程中lldb调试技巧-po篇

为啥我在lldb中输入图像查找<地址>时没有输出? [关闭]

IOS调试lldb命令常用po

LLDB常用调试命令

如何在 LLDB 调试器中调用方法或执行代码?