背景:我正在使用Xcode 4.2中包含的数据建模工具来设置我的核心数据实体。我编写了一些代码,将NSManagedObject转换为字典,以便于将数据作为JSON上传到Web服务。我想将某些实体属性标记为不应序列化为JSON的实体属性。我希望通过向每个我不想序列化的属性的“用户信息”添加一个键和值来实现此目的。使用Xcode 4数据建模工具这样做应该允许以下代码片段工作(这是NSManagedObject上类别的一部分,所以这就是“自我”):
NSDictionary *attributesByName = [[self entity] attributesByName];
NSMutableDictionary *valuesDictionary = [NSMutableDictionary dictionaryWithCapacity:[attributesByName count]];
[valuesDictionary setObject:[[self entity] name] forKey:@"ManagedObjectName"];
for (NSString *attributeName in [attributesByName allKeys])
{
NSAttributeDescription *description = [attributesByName objectForKey:attributeName];
id dontSerializeValue = [[description userInfo] valueForKey:@"dontSerialize"];
if (!dontSerializeValue)
{
id attributeValue = [self valueForKey:attributeName];
[valuesDictionary setObject:((attributeValue) ? attributeValue : [NSNull null]) forKey:attributeName];
}
}
所以,我的问题是这样的:[描述userInfo]的结果(如上面的上下文中所使用的)总是为零,所以很明显,没有键/值对。我有几个版本的模型,但我确保我正在编辑“当前”版本(并在将键和值添加到实体属性后保存)。另一个有趣的事情是,如果我退出Xcode(显然先保存)然后再打开它,我添加到任何属性的用户信息的东西都消失了。有没有人知道发生了什么?
答案 0 :(得分:2)
通过纯粹的运气(在我将代码转换为使用来自我的实体的userInfo而不是实体上的单个属性之后),我发现了问题所在。
在选择xcdatamodel文件时,Xcode 4在“文件检查器”中的“核心数据模型”下具有“工具版本最小”属性。我的数据模型的这个属性的值是“Xcode 3.2”。一时兴起,我将此值更改为“Xcode 4.2”。突然,我的NSAttributeDescription对象让userInfo返回我期望的内容!
我希望有更多使用Xcode 4进行数据建模的文档。当我进行搜索时,大多数Apple文档都没有更新以反映Xcode 4中引入的更改。
无论如何,希望这篇文章可以帮助别人解决我遇到的麻烦。