2011-09-23 96 views
1

我最近处理了一些错误,其中我将得到一个异常,提到一个通过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%@”即可。

+0

我认为像 “X-coredata:// blahblahblahblahblah /实体名称/ P22”(P22的部分)是的objectID在CoreData实体(永久的),你可以得到的只是NSLog'ing中的objectID消息 –

+0

以获得数字ID,您可以只取objectID的最后一部分并去掉alpha部分。也就是说,拿“p22”并得到“22”,这将对应于你的sqlite数据库中的z_pk –

回答

2

我质疑这个的价值,但它可以通过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]; 
} 
+0

如果你质疑它的价值,我可以接受其他关于如何调试引用objectID的异常的建议。 – morningstar

+0

我通常在调试器中捕获它们并在它们活着时询问对象。最坏的情况下,我会通过NSLog(@“Object%@”,someMO)将整个对象吐出到控制台;'' –

0

核心数据NSManagedObject有一个属性debugDescription,使用它。

NSManagedObject * customer = nil; 

NSLog(@"customer : %@", customer.debugDescription); 
相关问题