在 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)对对象进行故障处理以减少内存使用,然后
在需要时重生,例如,在访问属性时。
存在例外情况(导致不良行为):
对象被删除故障;在这种情况下,尝试访问它会使您的应用程序崩溃;您应该检查反向关系并考虑 nullify 或 cascade 删除规则;
您的实现文件(在 Obj-C 中)没有将属性声明为 @dynamic
,而是使用 @synthesize
.
您的情况可能如下:
- 在第一次获取时,对象被检索并缓存(在 Core Data 缓存中);
- 出于某种原因(希望不是因为您要删除它们!)缓存中的对象无法为您的应用释放一些内存;
如果是这种情况,出错也没什么问题。
请尝试在您的方法末尾添加以下语句,以检查对象是否可以在出错后重新进入内存:
NSLog(@"Object: %@", [retrievedData firstObject]);
NSLog(@"Object attribute: %@", [[retrievedData firstObject] valueForKey:@"codeFoils"]);
我正在 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)对对象进行故障处理以减少内存使用,然后
在需要时重生,例如,在访问属性时。
存在例外情况(导致不良行为):
对象被删除故障;在这种情况下,尝试访问它会使您的应用程序崩溃;您应该检查反向关系并考虑 nullify 或 cascade 删除规则;
您的实现文件(在 Obj-C 中)没有将属性声明为
@dynamic
,而是使用@synthesize
.
您的情况可能如下:
- 在第一次获取时,对象被检索并缓存(在 Core Data 缓存中);
- 出于某种原因(希望不是因为您要删除它们!)缓存中的对象无法为您的应用释放一些内存;
如果是这种情况,出错也没什么问题。
请尝试在您的方法末尾添加以下语句,以检查对象是否可以在出错后重新进入内存:
NSLog(@"Object: %@", [retrievedData firstObject]);
NSLog(@"Object attribute: %@", [[retrievedData firstObject] valueForKey:@"codeFoils"]);