2010-07-03 95 views
1

我有一个名为Team的NSManagedObject(NSMO)的子类。团队与另一个名为合同的NSMO子类拥有一对多的关系。合同与玩家(另一个NSMO)是一对一的。我想简化我使用团队的代码并能够引用其“玩家”。玩家将只是一群与特定团队签订合同的玩家。获取属性作为NSManagedObject子类的属性

我已经尝试在XCode的数据建模工具中创建一个叫做播放器的提取属性,但很少成功。我尝试了许多不同的方法,但最有意义的方法是将其命名为“球员”,将目标作为球员并最终具有作为我的谓词“contract.team.name == SELF”。

在我的团队类中,我有一个名为玩家的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)我可以使用什么代码来获取数组或设置?

谢谢! Rob

回答

9

您获取获取关系的正常回报。你有什么是一个错误,即一个对象的鬼魂。直到您尝试直接访问其属性时才会加载实际的托管对象。

核心数据使用关系中的错误来防止为了查找一小块数据而将大量对象加载到内存中。假设您与另一侧的1,000个托管对象有关系,并且您需要来自其中一个托管对象的一个​​整数值。如果没有错误,Core Data将不得不将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]); 

...输出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. 与所有托管对象一样,如果直接登录对象,则经常会看到错误。
+0

哇,谢谢!我需要进入并尝试这一点。 – rob5408 2010-07-04 19:56:05

+0

梦幻般的答案。尽管有一个问题,不应该将关系视为NSSet实例而不是NSArray? – 2010-07-10 14:39:30

+0

@Marcus - 提取属性中的提取返回数组,所以我就这样离开它。 – TechZen 2010-07-10 17:01:34

1

您能不能致电[aTeam valueForKeyPath:@"contracts.player"]

+0

嗨,谢谢,这适用于我的问题。尽管如此,我仍然希望看到问题的答案。但是你给我的让我继续我的项目。 – rob5408 2010-07-04 09:10:44