在创建时记录核心数据NSManagedObject ID的最佳方式是什么?
我最近处理了一些错误,其中我将得到一个异常,提到一个通过URI管理的对象。该URI有点帮助。它看起来有点像x-coredata:// blahblahblahblahblah/EntityName/p22。至少我可以告诉发生了什么类型的实体,但我还没有能够追踪到特定的对象。到目前为止,我已经能够调试这些问题而无需弄清楚。在创建时记录核心数据NSManagedObject ID的最佳方式是什么?
我想我可以追踪它。我可能会打开数据库并执行SQL查询,直到找到与URL中的某些内容相匹配的东西。但是,这看起来有点麻烦,如果我必须调试beta测试人员或部署的用户设备上发生的问题,效率也不是很高。所以我认为在创建对象时记录对象ID URI以及我可以识别对象的一些属性会很好。
应该很简单吧?刚刚好后,我在我的代码创建一个对象,我做一个的NSLog类似
NSLog(@"Created Foo instance: %@", [foo.objectID URIRepresentation]);
唯一的问题是,在我的URI; M越来越不喜欢看上面。他们看起来更像x-coredata:/// EntityName/blahblahblahblahblah。我意识到我可能会获得临时ID。
那么,我该如何将它与永久ID相匹配呢?如果我可以找到一个挂钩,我只需将日志消息写成“Object with temporary ID%@ reassigned permanent ID%@”即可。
我质疑这个的价值,但它可以通过NSManagedObject
本身的两种方法。
首先,直接在模型或子类中设置一个瞬态NSString
。然后覆盖下面的方法:
- (void)willSave
{
if (![[self objectID] isTemporaryID]) return;
[self setTemporaryIDString:[[[self objectID] URIRepresentation] absoluteString]];
}
- (void)didSave
{
if (![self temporaryIDString]) return;
NSLog(@"%@ moved to %@", [self temporaryIDString], [[[self objectID] URIRepresentation] absoluteString]);
[self setTemporaryIDString:nil];
}
如果你质疑它的价值,我可以接受其他关于如何调试引用objectID的异常的建议。 – morningstar
我通常在调试器中捕获它们并在它们活着时询问对象。最坏的情况下,我会通过NSLog(@“Object%@”,someMO)将整个对象吐出到控制台;'' –
核心数据NSManagedObject有一个属性debugDescription,使用它。
NSManagedObject * customer = nil;
NSLog(@"customer : %@", customer.debugDescription);
我认为像 “X-coredata:// blahblahblahblahblah /实体名称/ P22”(P22的部分)是的objectID在CoreData实体(永久的),你可以得到的只是NSLog'ing中的objectID消息 –
以获得数字ID,您可以只取objectID的最后一部分并去掉alpha部分。也就是说,拿“p22”并得到“22”,这将对应于你的sqlite数据库中的z_pk –