Базовый предикат данных, чтобы проверить, содержат ли дочерние объекты атрибут или «путь к ключу»? - PullRequest
6 голосов
/ 28 октября 2011

Я создаю запрос NSFetchRequest для базовых данных в задаче c. В модели данных есть абстрактная родительская сущность (которая содержит 4 основных атрибута) и множество различных дочерних сущностей, которые включают атрибуты, которых нет в родительской. Некоторые дочерние элементы содержат атрибуты с одинаковыми именами и типами данных.

Я применяю fetchRequest к родительскому объекту, чтобы он проверял все экземпляры дочерних объектов, чтобы определить, существует ли «путь к ключу».

Можно ли создать предикат, который будет возвращать только дочерние объекты, которые содержат определенный атрибут?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ IN self.entityAttributes",attribute.name];

Здесь attribute является экземпляром NSAttributeDescription, и цель состоит в том, чтобы искать другие объекты, которые имеют атрибут с совпадающим именем в их списке атрибутов, но я не уверен, как отформатировать предикат.

Я могу уточнить, если это необходимо. Спасибо!

Ответы [ 2 ]

5 голосов
/ 28 октября 2011

Есть ли причина, по которой вы проверяете экземпляры, а не модель?Вы можете легко узнать, какие типы сущностей имеют данное свойство

for (NSEntityDescription* entityDescription in [self managedObjectModel]) {
  if ([[entityDescription propertiesByName] objectForKey:@"someProperty"] != nil) {
    // objects of this entity support the property you're looking for
  }
}
1 голос
/ 28 октября 2011

Интересный вопрос, достойный некоторого эксперимента (при отсутствии лучшей помощи).

Я пробовал этот предикат на управляемом объекте:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.attributesByName.allKeys CONTAINS %@", @“nameOfAttrSought”];

Но я получил эту ошибку: «невыполненная генерация SQL для предиката. ”

Что наводит меня на мысль, что SQL не готов копаться в NSArrays, что вы получаете, запрашивая NSEntityDescription для его имен атрибутов.может придумать предикат, который будет делать то, что вы хотите через запрос прямой выборки, я бы предложил этот обходной путь:

Определить сущность Namer, которая имеет одну строку attr named и to-manyотношения members.Создайте один из них для каждого из возможных атрибутов, которые могут иметь ваши целевые дочерние объекты.Затем дайте ребенку соблазнить отношение ко многим к Namer, которое называется namers (обратное отношение members).После вставки добавьте соответствующие «имена» в это отношение.Тогда вы могли бы сделать предикат извлечения следующим образом:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@“ANY namers == %@“, namerSought];
// ("namerSought" is an instance of Namer.)
...