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

Retrieve operation unexpected behaviour in iOS CoreData

我正在 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>)",

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

某些处于 "fault" 状态的核心数据对象不一定有问题。

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

简而言之:

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

  • 该机制应该透明地工作:

    • 可以(通过 SDK)对对象进行故障处理以减少内存使用,然后

    • 在需要时重生,例如,在访问属性时。

  • 存在例外情况(导致不良行为):

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

    • 您的实现文件(在 Obj-C 中)没有将属性声明为 @dynamic,而是使用 @synthesize.

您的情况可能如下:

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

如果是这种情况,出错也没什么问题。

请尝试在您的方法末尾添加以下语句,以检查对象是否可以在出错后重新进入内存:

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