检索iOS CoreData中的操作意外行为

时间:2015-01-15 09:49:32

标签: ios core-data ios7

我将数据存储在iOS中并尝试检索它。为此,我使用以下功能:

        NSManagedObjectContext *managedObjectContext = [DatabaseOperation managedObjectContext];
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:CODE_SEARCH_ENTITY];
        NSMutableArray *datasAA = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
        NSMutableArray *retrievedData = datasAA;
        NSLog(@"Dictionary Data: %@",retrievedData);

我第一次得到低于回应:

"<NSManagedObject: 0x7d668660> (entity: xyx; id: 0x7d668570 <x-coredata://48CFFB0A-DF7C-468B-A134-87BACFEA95CC/CodeSearchTable/p52> ; data: {\n    codeFoils = 12;\n    codeHospitalPrice = 6786;\n    codeId = 88;\n    codeMaxRetail = 9240;\n    codeNeedleDesc = \"1/2 Circle Round Body Blunt\";\n    codeNeedleDimen = \"44 MM\";\n    codeNid = NW9367;\n    codeSize = 1;\n    sutureTypeLength = \"PDS II Monofilament (Voilet) 150 CM Loop\";\n})",
"<NSManagedObject: 0x7d668770> (entity: xyx; id: 0x7d6684b0 <x-coredata://48CFFB0A-DF7C-468B-A134-87BACFEA95CC/CodeSearchTable/p53> ; data: {\n    codeFoils = 12;\n    codeHospitalPrice = 5149;\n    codeId = 88;\n    codeMaxRetail = 6960;\n    codeNeedleDesc = \"1/2 Circle Round Body (Heavy)\";\n    codeNeedleDimen = \"40 MM\";\n    codeNid = NW9371;\n    codeSize = \"1/0\";\n    sutureTypeLength = \"PDS II Monofilament (Voilet) 90 CM\";\n})",

但是下次我运行时会给我以下结果:

"<NSManagedObject: 0x78616510> (entity: xyz; id: 0x78760110 <x-coredata://B8C411F0-5C73-413B-8709-B7F805B6E413/CodeSearchTable/p611> ; data: <fault>)",
"<NSManagedObject: 0x78616550> (entity: xyz; id: 0x78760120 <x-coredata://B8C411F0-5C73-413B-8709-B7F805B6E413/CodeSearchTable/p612> ; data: <fault>)",

请解释一下我在这里做错了什么。提前致谢。

1 个答案:

答案 0 :(得分:2)

某些Core Data对象不一定存在问题&#34; fault&#34;状态。

看看这个document,它解释了这一切。

简而言之:

  • 错误是一种提高性能(内存使用)的机制;

  • 机制应该透明地工作:

    • 对象可能出现故障(由SDK)以减少内存使用,然后

    • 在需要时重新获取,例如,在访问属性时。

  • 有例外(导致不良行为):

    • 对象因删除而出现故障;在这种情况下,尝试并访问它会使您的应用程序崩溃;你应该检查反向关系并考虑 nullify 级联删除规则;

    • 您的实施文件(在Obj-C中)不会将该属性声明为@dynamic,而是使用@synthesize

您的情况可能会发生以下情况:

  • 在第一次获取时检索并缓存对象(在Core Data缓存中);
  • 出于某种原因(希望,不是因为你要删除它们!)缓存中的对象出现故障,为你的应用程序释放一些内存;

如果是这种情况,那么错误就没有错。

请尝试在方法结束时添加以下语句,以检查在出错之后是否可以将对象带回内存:

NSLog(@"Object: %@", [retrievedData firstObject]);
NSLog(@"Object attribute: %@", [[retrievedData firstObject] valueForKey:@"codeFoils"]);