检索 iOS 核心数据中的操作意外行为



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

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

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

看看这个文档,它解释了这一切。

总之:

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

  • 该机制应透明地运作:

    • 可以错误对象(由 SDK )以减少内存使用量,然后

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

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

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

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

在您的情况下发生的情况可能如下:

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

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

请尝试在方法末尾添加以下语句,以检查错误后是否可以将对象恢复到内存中:

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

最新更新