目标 C:在非结构或联合的情况下请求成员 XXX。 (核心数据)

Posted

技术标签:

【中文标题】目标 C:在非结构或联合的情况下请求成员 XXX。 (核心数据)【英文标题】:Objective C: Request for member XXX in something not a structure or union. (Core Data) 【发布时间】:2011-04-17 18:55:46 【问题描述】:

我在实现核心数据时遇到了这个错误。

我创建了一个具有“问题”和“答案”属性的实体“抽认卡”。这两个属性都是 NSString 类型的。

在 NSManaged Object 中插入一个新对象后,我尝试设置 2 个属性,如下所示。

 NSManagedObject *newCard = [NSEntityDescription insertNewObjectForEntityForName:@"FlashCard" inManagedObjectContext:self.managedObjectContext];
 newCard.question = thisQuestion;
 newCard.answer = thisAnswer;

但是当我尝试编译代码时,我遇到了错误“请求成员'问题'不是结构或联合'。我在 newCard.answer 行中遇到同样的错误。

非常感谢任何有关如何解决此问题的建议!

【问题讨论】:

【参考方案1】:

您的newCard 实例的类型应为FlashCard 而不是NSManagedObject;否则,编译器不会知道newCard 具有questionanswer 属性。

FlashCard *newCard = (FlashCard *)[NSEntityDescription insertNewObjectForEntityForName:@"FlashCard" inManagedObjectContext:self.managedObjectContext];
newCard.question = thisQuestion;
newCard.answer = thisAnswer;

【讨论】:

如果他们没有为 FlashCard 创建子类怎么办? 我假设 FlashCard 类存在,因为他试图使用点符号访问属性。 是的,我有一个 FlashCard 类,但是,在尝试按照您的建议使用 (FlashCard *) 进行投射时,我仍然遇到错误。我可以检查是否还有其他我遗漏的东西吗?我有一个 Flash.h 文件,其中包含 @dynamic 问题、答案(属性) @Zhen,它们被定义为属性了吗?你的FlashCard.h 文件中应该有@property (nonatomic, retain) NSString *question;@property (nonatomic, retain) NSString *answer;【参考方案2】:

您已将 newCard 声明为 NSManagedObject,然后尝试访问 NSManagedObject 未定义的属性。

Core Data 让您可以选择使用 NSManagedObject 的自定义子类来表示实体。如果你这样做,那么正如其他人所建议的那样,你需要将 newCard 声明为该子类的实例(如果你不这样做,你必须编写类并自己声明属性,如果你想使用 'dot' 属性语法 --- 核心数据不会自动为每个实体类型创建 NSManagedObject 的子类)

此外,您不必使用自己的子类或编写访问器来访问托管对象的属性和关系。如果您还不需要向 FlashCard 添加任何自定义逻辑,则可以在 NSManagedObject 上使用键值编码。这样可以正常工作:

NSManagedObject *newCard = [NSEntityDescription insertNewObjectForEntityForName:@"FlashCard" inManagedObjectContext:self.managedObjectContext];

[newCard setValue: thisQuestion forKey: @"question"];
[newCard setValue: thisAnswer forKey: @"answer"];

【讨论】:

感谢您的解决方案,它现在工作正常。我能澄清一点吗?在我的 Flash.h 文件中,我有@dynamic question, answer。您是说我无法通过点符号访问这两个属性?我需要先声明一个 FlashCard *newCard 实例,然后才能使用点符号? @Zhen,确保您已将问题和答案定义为 FlashCard 标头中的属性——请参阅下面的评论。 @Zhen:就像conmulligan所说的,你需要使用@property....来声明头文件中的属性。 @dynamic 应该在你的实现文件中。它实际上并没有做任何事情,只是告诉编译器不要抱怨该属性尚未实现(核心数据将在运行时为您实现该属性)【参考方案3】:
#import "FlashCard.h"

“FlashCard.h”是否包含在该文件的顶部?

【讨论】:

是的,我已将它包含在文件顶部。但是,即使这样,我仍然遇到这个问题。

以上是关于目标 C:在非结构或联合的情况下请求成员 XXX。 (核心数据)的主要内容,如果未能解决你的问题,请参考以下文章

在非结构或联合的事物中请求成员'_file'[关闭]

编译时在非结构或联合中获取成员“indexPath”的错误请求

编译错误:请求非结构或联合中的成员

CoreData 和访问关系的问题:请求非结构或联合中的成员

分配给具有数组类型的表达式并请求非结构或联合中的成员[关闭]

错误:C2016 C 要求结构或联合至少有一个成员