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

rob*_*408 2 xcode cocoa core-data data-modeling objective-c

我有一个名为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
Run Code Online (Sandbox Code Playgroud)

......对我来说毫无意义.我觉得我做了很多错事我甚至不知道从哪里开始处理它.

所以我想我的问题是1)这个获取属性应该在我的NSMO子类中假设什么类型.(我把它作为NSArray,但显然它是一个NSFetchedPropertyDescription)2)我可以使用什么代码来获取数组或出来?

谢谢!抢

Tec*_*Zen 9

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

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

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

@interface TestEntityMO :  NSManagedObject  
{}
@property (nonatomic, retain) NSNumber * order;
@property(nonatomic, retain)  NSArray *theFetchedProperty;
Run Code Online (Sandbox Code Playgroud)

设置如下:

TestEntityMO *testMO;
for (int i=0; i<10; i++) {
    testMO=[NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext];
    testMO.order=[NSNumber numberWithInt:i];
}
Run Code Online (Sandbox Code Playgroud)

然后记录创建的最后一个TestEntityMO对象.在第一次登录的属性,则返回一个错误:

NSLog(@"testMO.theFetchedProperty == %@",testMO.theFetchedProperty);
Run Code Online (Sandbox Code Playgroud)

输出

testMO.theFetchedProperty == Relationship fault for (<NSFetchedPropertyDescription: 0x3d19210>), //... rest removed for brevity
Run Code Online (Sandbox Code Playgroud)

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

NSLog(@"[testMO.theFetchedProperty count] == %d",[testMO.theFetchedProperty count] );
Run Code Online (Sandbox Code Playgroud)

...输出:

[testMO.theFetchedProperty count] == 4
Run Code Online (Sandbox Code Playgroud)

您可以像索引一样在索引处获取对象:

NSLog(@"[testMO.theFetchedProperty objectAtIndex:0] == %@",[testMO.theFetchedProperty objectAtIndex:0]);
Run Code Online (Sandbox Code Playgroud)

...输出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>
    );
})
Run Code Online (Sandbox Code Playgroud)

记录随机对象的属性值:

NSLog(@"[[testMO.theFetchedProperty objectAtIndex:0] order] == %@",[[testMO.theFetchedProperty objectAtIndex:1] order]);
Run Code Online (Sandbox Code Playgroud)

...输出:

[[testMO.theFetchedProperty objectAtIndex:1] order] == 8
Run Code Online (Sandbox Code Playgroud)

但是,如果通过上面的代码触发提取后再次记录fetched属性,则会得到一个实际对象:

NSLog(@"testMO.theFetchedProperty == %@",testMO.theFetchedProperty);
Run Code Online (Sandbox Code Playgroud)

...输出:

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>
    );
}),...
Run Code Online (Sandbox Code Playgroud)

总之,你可以:

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