CoreData的NSFetchrequest:以动态方式提供类名和属性名

时间:2011-06-24 12:31:43

标签: objective-c ios core-data introspection

在CoreData中,当您想要查询对象时,您必须在字符串中指定实体的名称和属性的名称,如下所示:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

fetchRequest.entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"Name=%@ AND Forename=%@", name, vorname];

我真的不喜欢这种方法,因为在这样做时,IDE无法帮助我重命名其中一个属性或重命名类名。

使用这个代码块,我通过内省获取classname使我的调用更加动态:

NSString *classname = [[Person class] description];    
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

fetchRequest.entity = [NSEntityDescription entityForName:classname inManagedObjectContext:context];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"Name=%@ AND Forename=%@", name, vorname];

有没有办法以同样的方式获取属性的名称(Name和Forename)? 我不知道如何动态处理属性。

你明白了吗?如果有人能指出我正确的方向,我会很高兴。

2 个答案:

答案 0 :(得分:0)

我以这种方式在资源包中使用了plists,基本上,创建一个NSDictionary,它将作为参数的键映射到手头对象上的属性名称,然后只是将其命名为MyClassname.plist,以便轻松加载到内存中。但是,你必须为你想要的每个课程写一个。 (如果更改属性名称,则编辑它们)

不确定是否有更简单的方法。

而且,IIRC,你按键分到:

[NSPredicate predicateWithFormat:@"%k=%@",[plist objectForKey:@"param1"],[personObject valueForKey:[plist objectForKey:@"param1"]]]

答案 1 :(得分:0)

我不确定entityForName:[[Person class] description]超过entityForName:@"Person"(或者entityForName:PersonEntityName,其中PersonEntityName只是一个常量)。只要表示实体的类的名称与实体的名称相同,它就可以正常工作,但通常情况并非如此。对于简单实体使用普通的旧NSManagedObject是很常见的,这显然与实体名称不匹配。

同样,如果您正在创建获取请求,那么您感兴趣的属性的名称通常已经确定且不太可能更改,因此通过名称指定它们通常是最简单的方法。您可以从实体描述中获取一系列属性,但是如果您还不知道它的名称,您将如何知道要使用哪个属性?如果你知道属性的名称,那么检索属性描述就没什么意义了,所以你可以得到它的名字。 ; - )

有时候,在应用程序运行之前保持实体和属性不确定是有帮助的,例如当您想让用户指定搜索参数时。但是,在您给出的示例中,情况显然不是这样,因为您已经给出了谓词的格式。