在创建时记录Core Data NSManagedObject ID的最佳方法是什么?

时间:2011-09-23 04:48:54

标签: iphone core-data

我最近处理了一些错误,其中我将得到一个异常,它通过URI提到了一个托管对象。 URI有点帮助。它看起来有点像x-coredata:// blahblahblahblahblah / EntityName / p22。至少我可以告诉问题发生在什么类型的实体上,但我还没有能够跟踪它到特定的对象。到目前为止,我已经能够调试问题而无需弄清楚。

我想我可以追踪它。我可能会打开数据库并执行SQL查询,直到找到与URL中的某些内容相匹配的内容。然而,这似乎有点麻烦,如果我必须调试beta测试人员或部署用户设备上发生的问题,也不是很有效。所以我认为在创建对象时记录对象ID URI以及我可以识别对象的一些属性会很好。

应该简单吧?就在我在代码中创建一个对象之后,我做了类似

的NSLog
NSLog(@"Created Foo instance: %@", [foo.objectID URIRepresentation]);

唯一的问题是,我得到的URI看起来不像上面那样。它们看起来更像x-coredata:/// EntityName / blahblahblahblahblah。我意识到我可能正在获得临时身份证。

那么,我怎样才能将其与永久ID相匹配?如果我能找到一个钩子,我可以在其中放置一条日志消息,说“具有临时ID%@重新分配永久ID%@的对象”,这就是我所需要的。

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

NSManagedObject * customer = nil;

NSLog(@"customer : %@", customer.debugDescription);