你得到的是正常的回报。你所犯的错误就是物体的幽灵。在您尝试直接访问其属性之前,不会加载实际的托管对象。
核心数据使用关系中的错误来防止仅仅为了找到一小块数据就必须将大量对象加载到内存中。假设您与另一端的1000个托管对象有关系,并且需要其中一个托管对象的一个整数值。如果没有错误处理,核心数据必须将1000个对象加载到内存中,才能找到并检索32位数据。对于断层,核心数据知道
哪里
整数值是,并且可以用它的一个值得到一个对象。
theFetchedProperty
是具有谓词的获取属性
"TestEntity.order>5"
@interface TestEntityMO : NSManagedObject
{}
@property (nonatomic, retain) NSNumber *order;
@property (nonatomic, retain) NSArray *theFetchedProperty;
TestEntityMO *testMO;
for (int i=0; i<10; i++) {
testMO=[NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext];
testMO.order=[NSNumber numberWithInt:i];
}
然后记录创建的最后一个TestEntityMO对象。这个
第一次
如果记录属性,它将返回一个错误:
NSLog(@"testMO.theFetchedProperty == %@", testMO.theFetchedProperty);
输出
testMO.theFetchedProperty == Relationship fault for (<NSFetchedPropertyDescription: 0x3d19210>), //... rest removed for brevity
NSLog(@"[testMO.theFetchedProperty count] == %d", [testMO.theFetchedProperty count] );
... 输出:
[testMO.theFetchedProperty count] == 4
NSLog(@"[testMO.theFetchedProperty objectAtIndex:0] == %@",[testMO.theFetchedProperty objectAtIndex:0]);
[testMO.theFetchedProperty objectAtIndex:0] == <TestEntityMO: 0x3d20a70> (entity: TestEntity; id: 0x3d20ab0 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A11> ; data: {
order = 9;
theFetchedProperty = (
0x3d20ab0 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A11>,
0x3d20a00 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A10>,
0x3d20880 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A8>,
0x3d20970 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A9>
);
})
记录随机对象的属性值:
NSLog(@"[[testMO.theFetchedProperty objectAtIndex:0] order] == %@", [[testMO.theFetchedProperty objectAtIndex:1] order]);
... 输出:
[[testMO.theFetchedProperty objectAtIndex:1] order] == 8
然而,
如果再次记录获取的属性
在你触发抓取之后
通过上面的代码,您可以得到一个实际的对象:
... 输出:
testMO.theFetchedProperty == Relationship objects for (
<TestEntityMO: 0x3d20a70> ... ;
data: {
order = 9;
theFetchedProperty = (
0x3d20ab0 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A11>,
0x3d20a00 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A10>,
0x3d20880 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A8>,
0x3d20970 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A9>
);
}),...
-
对待获取的关系就像对待代码中的nsarray一样。
-
与所有托管对象一样,如果直接记录对象,通常会看到错误。