获取属性作为NSManagedObject子类的属性

时间:2010-07-03 18:49:26

标签: objective-c cocoa xcode core-data data-modeling

我有一个名为Team的NSManagedObject(NSMO)的子类。团队与另一个名为Contract的NSMO子类有一对多的关系。合同与玩家一对一(另一个NSMO)。我想简化使用Team的代码,并且只能引用它的“玩家”。玩家将只是与特定团队签订合同的一系列玩家。

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

在我的Team类中,我有一个名为players的NSArray属性(在实现中有@dynamic播放器)。当我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)我可以用什么代码来获取阵列或出发?

谢谢!罗布

2 个答案:

答案 0 :(得分:9)

获得正常回归的关系。你所拥有的是一个错误,即一个物体的幽灵。在您尝试直接访问其属性之前,不会加载实际的托管对象。

核心数据使用关系中的错误来防止必须将大量对象加载到内存中才能找到一小块数据。假设您与另一侧的1,000个托管对象有关系,并且您需要来自其中一个托管对象的一个​​整数值。没有错误,Core Data必须将1,000个对象加载到内存中才能找到并检索32位数据。对于错误,Core Data知道 整数值,并且可以获得具有一个值的一个对象。

您可以像处理数组一样处理已获取的属性。以这个简单的托管对象子类为例,其中theFetchedProperty是一个谓词为"TestEntity.order>5"

的fetched属性
@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

...但你可以像数组一样记录fetched属性的计数:

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

总之,你可以:

  1. 像代码中的NSArrays一样处理获取的关系。
  2. 与所有托管对象一样,如果直接记录对象,通常会看到错误。

答案 1 :(得分:1)

你能不能只拨打[aTeam valueForKeyPath:@"contracts.player"]