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