核心数据:使用plain int数据类型时的“EXC_BAD_ACCESS”

时间:2013-05-20 16:31:10

标签: ios objective-c cocoa-touch core-data

我对存储普通" int"有一些疑问。或"短" (int16_t)属性在"核心数据"数据管理框架(在我的案例中,在iOS 6上)。 我试着以各种方式使用它,并发现无法做到,没有上述异常。现在,几周后,我在StackOverflow中发现了这篇文章,看起来有人确实如此:

请参阅以下示例,以便在#34; Daniel Eggert"的较低答案中存储枚举: Best way to implement Enums with Core Data

这里看起来好像他使用普通的" int16_t"并将其映射到核心数据"进入"整数16"在数据模型中......这真的有效吗?我完全按照规定进行了尝试(即使使用相同的命名:-))并且它以众所周知的" EXC_BAD_ACCESS"例外......如预期的那样。

对此有什么看法?我是否误解了相关的答案?

----编辑:--- 有趣的是有人如何评价这个问题(甚至正确地链接另一个问题),但没有答案?!无论如何:

我现在尝试使用"事件" Apple的示例应用程序,它的工作原理。 我自己的测试仍然不起作用。应用程序之间的主要区别:

  • 我的托管类不是自动生成的,我重用了现有的类
  • 我仍然有一些属性" @ synthesize"在我现有的课程中

我自己的实体(托管对象): H:

@interface TestEntity : NSManagedObject
{
}
@property (nonatomic) int64_t testAttribute;
@end

米:

@dynamic testAttribute;

模型数据类型:"整数64"。

other.m:

TestEntity *testEntity = (TestEntity *)[NSEntityDescription insertNewObjectForEntityForName:@"Trip" inManagedObjectContext:[GenericDAO getManagedContext]];
[testEntity setTestAttribute : 4]; //this triggers the exception

2 个答案:

答案 0 :(得分:0)

在上周详细讨论整个问题之后,我发现使用iOS 6和最新的XCode(在我的情况下为4.6.2)我可以完全按照我的问题中提到的链接中的指定完成所有操作。我所看到的问题与一组技术细节有关,这些细节根本没有记录。我是怎么知道的?我只是执行以下步骤来验证我的实体:

  • 使用支持Core Data的Xcode创建一个新的空项目
  • 在Xcode中使用“编辑器”菜单项“导入”,打开数据模型(选择要与Core-Data一起使用的“XY.xcdatamodeld”。
  • 您将看到模型中导入的项目以及“错误”指定的项目(通过属性设置或其他方式)
  • 现在只需创建您最初想要编码为原始数据类型的所有属性,然后在“编辑器”菜单中选择“导出”菜单项(选择数据模型时!)。小心:选中“创建基元数据类型”复选框以获取基类型而不是Cocoa /对象属性。

要检查原始项目,请在原始项目中执行此操作,在我的案例中,Core-Data甚至菜单项看起来都不同(某些选项显示为灰色):

  • 在旧/您的当前项目中执行相同的步骤(将实体导入数据模型)。​​
  • 如果结果不同,这将告诉您项目设置在某种程度上不兼容/旧,您可以更改项目设置以找出哪些影响Core Data行为。
  • 还尝试使用导出功能查看它是否正确生成代码。

其他重要提示:您可以在Core-Data数据模型编辑器中选择属性并在项目之间复制/粘贴它们。如果您想要迁移某些实体/属性进行测试,这非常方便。不要只复制整个“cxdatamodeld”设置文件,它保留旧项目的设置(我尝试了两次以验证它)。

答案 1 :(得分:0)

检查是否为Core Data Model文件中的所有实体正确设置了Name,Class和Parent Entity。检查所有类名是否与实体名称匹配。出现问题的原因是在编译模型时,它没有找到带有setter的头文件。