CoreData NSPredicate属性名称

时间:2013-01-03 16:08:13

标签: objective-c ios core-data nspredicate

我已经开始使用CoreData编写iPhone应用程序并尝试使我的代码库尽可能可维护。因此,我想避免使用硬编码字符串,例如:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", aName];

相反,我希望能够写出类似的内容:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", Person.name, aName];

这样我就可以让编译器检查name是否是实体Person的属性并避免拼写错误。

使用此代码虽然我在编译时遇到以下错误: 在name

类型的对象上找不到属性Person

Person属于NSManagedObject类型,由我的MyApp.xcdatamodeld自动生成。

name是实体Person

的简单字符串属性

为了解决这个具体问题,我已经开始搜索了很多内容并且已经做了很多努力。到目前为止,我还尝试使用property_getNameNSPropertyDescription并没有运气。

先谢谢你的帮助,

乔丝。

2 个答案:

答案 0 :(得分:4)

首先,Person.name不存在,因为“name”是person实例的属性,而不是类级属性。

我不确定从编译器检查的方法名到字符串是否有一条非常清晰的路径。您始终可以使用较低级别的方法从类中访问方法签名并从中获取字符串,但这些方法的起点是未经检查的字符串(C或ObjC)。

一般情况下,如果你的名字出错,那么使用谓词会给你带来错误,因此任何使用谓词的测试都会验证你的方法名称是否正确。

您应该使用Mogenerator生成用于模型的数据对象。在这种情况下,您可以考虑更改模板以添加一个名为“stringForMethodNamed * Name *”的方法,并将其作为格式化谓词中的参数之一。

答案 1 :(得分:4)

如果您确实使用Mogenerator,根据Kendall的优秀建议,在自动生成的类中,您将在标题中声明三个struct - EntityNameAttributesEntityNameRelationships和{{ 1}}。例如,如果您的实体名为EntityNameFetchedProperties,并且具有属性Person,则可以使用name访问该密钥。这样可以避免在应用程序代码中使用硬编码的密钥名称。