NSFetchrequest от CoreData: предоставляет имена классов и имен свойств динамически - PullRequest
0 голосов
/ 24 июня 2011

В CoreData, когда вы хотите запросить объект, вы должны указать имя объекта и имена свойств в следующих строках:

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

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

Мне не очень нравитсяэтот подход, потому что при этом среда IDE не может помочь мне в сценариях, таких как переименование одного из свойств или переименование имени класса.

Используя этот кодовый блок, я сделал свой вызов немного более динамичным, получивимя класса по самоанализу:

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];

Есть ли способ получить имя свойств (имя и имя) таким же образом?Я не знаю, как обрабатывать свойства динамически.

Вы меня поняли?Я был бы счастлив, если бы кто-то мог указать мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 24 июня 2011

Я не уверен, что вижу большое преимущество entityForName:[[Person class] description] над entityForName:@"Person" (или, может быть, entityForName:PersonEntityName, где PersonEntityName - просто константа).Он работает нормально при условии, что имя класса, представляющего сущность, совпадает с именем сущности, но часто это не так.Весьма распространено использовать старый добрый NSManagedObject для простых сущностей, и это, очевидно, не соответствует имени сущности.

Аналогично, если вы создаете запрос на выборку, имена интересующих вас свойствОбычно они уже определены и вряд ли изменятся, поэтому проще всего их указать по имени.Вы можете получить массив свойств из описания объекта, но как вы узнаете, какое свойство использовать, если вы еще не знаете его имя?И если вы знаете имя свойства, то нет смысла извлекать описание свойства, чтобы вы могли получить его имя.; -)

Бывают случаи, когда полезно оставить сущность и свойства неопределенными до запуска приложения, например, когда вы хотите позволить пользователю указать параметры поиска.Однако в приведенном вами примере это явно не так, потому что вы указали формат предиката.

0 голосов
/ 24 июня 2011

Я использовал списки ресурсов в пакете ресурсов таким образом, в некотором роде - в основном, создаю NSDictionary, который сопоставляет ключи, которые являются вашими параметрами, с именами свойств объекта под рукой, а затем просто назовите егоMyClassname.plist для легкой загрузки в память.Вы должны написать один для каждого класса, для которого вы хотите это, хотя.(и измените их, если вы измените имена свойств)

Не уверен, что есть более простой способ.

И, IIRC, вы вводите ключи следующим образом:

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