gpt4 book ai didi

objective-c - 获取属性作为 NSManagedObject 子类的属性

转载 作者:行者123 更新时间:2023-12-03 16:23:48 27 4
gpt4 key购买 nike

我有一个名为 Team 的 NSManagedObject (NSMO) 子类。 Team 与另一个称为 Contract 的 NSMO 子类具有一对多关系。契约(Contract)与玩家(另一个 NSMO)有 1 对 1 的关系。我想简化使用 Team 的代码,并且能够仅引用其“玩家”。球员只是与给定球队签订契约(Contract)的一系列球员。

我尝试在 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>
);
}),...

总而言之,您可以:

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

关于objective-c - 获取属性作为 NSManagedObject 子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3172495/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com