代码之家  ›  专栏  ›  技术社区  ›  rob5408

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

  •  1
  • rob5408  · 技术社区  · 14 年前

    我有一个子类NSManagedObject(NSMO)叫做Team。团队与另一个名为Contract的NSMO子类有一对多关系。合同与球员(另一个NSMO)的比例为1比1。我想简化我的代码,使用团队,能够只引用它的“玩家”。球员将只是一个数组的球员有一个给定的球队合同。

    在我的团队类中,我有一个名为players的NSArray属性(实现中有is@dynamic players)。当我登录时(@“%@”,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子类中应该采用什么类型(我把它弄得乱七八糟,但很明显这是一个NSFetchedPropertyDescription) 2) 我可以使用什么代码来获取数组或设置?

    谢谢!抢劫

    2 回复  |  直到 14 年前
        1
  •  10
  •   Alex Walczak TechZen    3 年前

    你得到的是正常的回报。你所犯的错误就是物体的幽灵。在您尝试直接访问其属性之前,不会加载实际的托管对象。

    核心数据使用关系中的错误来防止仅仅为了找到一小块数据就必须将大量对象加载到内存中。假设您与另一端的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>
        );
    }),...
    

    1. 对待获取的关系就像对待代码中的nsarray一样。
    2. 与所有托管对象一样,如果直接记录对象,通常会看到错误。
        2
  •  1
  •   user155959 user155959    14 年前

    你能不能不打个电话 [aTeam valueForKeyPath:@"contracts.player"]