【问题标题】:Navigating a to-many relationship with Core Data使用 Core Data 导航一对多关系
【发布时间】:2013-04-02 22:35:42
【问题描述】:

如何在 Objective-C 中导航 Core Data 的多对多关系?

我有一个Event 模型,每个实例都有许多通过occurances [原文如此] 关系公开的EventOccurace 对象。 Apple 的文档说 standard property accessor should be available 但我不断收到编译时错误:

DetailViewController.h

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate>
@property (strong, nonatomic) id detailItem;
@end

DetailViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSSet * foo;

    foo = [[self detailItem] occurances];
    ///No known instance method for selector 'occurances'

    foo = self.detailItem.occurances;
    ///Property 'occurances' not found on object of type 'id'


    //try casting to NSManagedObject to access
    NSManagedObject * casted = (NSManagedObject *)self.detailItem;

    foo = casted.occurances;
    ///Property 'occurances' not found on object of type 'NSManagedObject *'

    foo = [casted occurances];
    ///No visible @interface for 'NSManagedObject' declares the selector 'occurances'
}

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

    要使用(动态创建的)访问器方法,您必须为您的实体创建 NSManagedObject 的子类。

    这在 Xcode 中很容易做到:在模型编辑器中选择实体,然后从菜单中选择“Editor -> Create NSManagedObject subclass ...”。在源代码中包含头文件(Event.h、EventOccurance.h)。那么

    Event *event = self.detailItem;
    NSSet *foo = event.occurances;
    

    应该可以。

    或者,您可以使用键值编码:

    NSSet *foo = [[self detailItem] valueForKey:@"occurances"];
    

    即使没有托管对象子类也可以工作。

    【讨论】:

    • 我也尝试了valueForKey 方法,但显然我的语法错误。我重新阅读了 Apple 文档,但我认为他们没有明确说明需要手动触发这些类。谢谢!这是完美的。
    【解决方案2】:

    一些可能无法正常工作的事情:

    首先检查您的 ManagedObject 类是否已生成。

    其次,您应该在某处指定 detailItem 的类型。或者在 .h 中,或者通过将其转换为 .m 中的类型。现在它只是一个“id”,编译器无法知道它的类型。

    第三,这是一种可能的访问方式:

    NSArray * occurances = [self.detailItem.occurances allObjects];
    for(EventOccurance * ocu in occurances){
        //blablabla
    }
    

    【讨论】:

    • 事实上,我根本没有生成它们。我的印象是这些类是由 Xcode 自动生成的。这很有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多