我有一个称为Team的NSManagedObject(NSMO)子类。团队与另一个称为Contract的NSMO子类具有一对多的关系。合同与播放器(另一个NSMO)是一对一的。我想简化使用Team的代码,并且只可以引用其“玩家”。球员只是与指定球队签有合同的一系列球员。

我尝试在XCode的数据建模工具中创建一个称为players的获取属性,但收效甚微。我尝试了许多不同的方法,但是最有意义的方法是将其命名为“玩家”,将目的地命名为“玩家”,最后将其谓词“ contract.team.name == SELF”。

在我的Team类中,我有一个称为players的NSArray属性(实现中的@dynamicplayers)。当我NSLog(@“%@”,self.players)退出时...

Relationship fault for (<NSFetchedPropertyDescription: 0x6d19cd0>), name players, isOptional 1, isTransient 1, entity Team, renamingIdentifier players, validation predicates (
), warnings (
), versionHashModifier (null), fetchRequest <NSFetchRequest: 0x6d1a080> (entity: Player; predicate: (contract.team.name == SELF); sortDescriptors: ((null)); type: NSManagedObjectResultType; ) on 0x6d38550


...这对我来说毫无意义。我觉得我做错了很多事情,我什至不知道从哪里开始解决它。

所以我想我的问题是
1)在我的NSMO子类中,此获取的属性应采用哪种类型。 (我把它做成了NSArray,但显然它是一个NSFetchedPropertyDescription)
2)我可以使用什么代码来获取数组或设置数组?

谢谢!抢

最佳答案

您会获得一段正常的关系回报。您所拥有的是故障,即对象的虚影。在尝试直接访问它们的属性之前,不会加载实际的托管对象。

核心数据使用关系中的错误来防止为了找到一小块数据而不得不将大量对象加载到内存中。假设您与另一侧的1,000个托管对象有关系,并且您需要这些托管对象之一中的一个整数值。毫无疑问,Core Data必须将1,000个对象加载到内存中才能查找和检索32位数据。发生故障时,Core Data会知道整数值在哪里,并且可以使用一个值来获得那个对象。

您可以像对待数组一样对待获取的属性。以这个简单的托管对象子类为例,其中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]);


...输出一个TestEntityMO对象的描述(可能是错误也可能不是错误。在这种情况下不是):

[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


但是,如果在上面的代码触发获取后第二次记录获取的属性,则会得到一个实际的对象:

NSLog(@"testMO.theFetchedProperty == %@",testMO.theFetchedProperty);


...输出:

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>
    );
}),...


总之,您可以:


就像代码中的NSArrays一样对待获取的关系。
与所有托管对象一样,如果直接记录该对象,通常会发现错误。

10-05 20:20
查看更多