NSFetchedResultsController и TableViews - PullRequest
0 голосов
/ 23 мая 2011

Я пытаюсь использовать базовые данные с NSFetchedResultsController.

Модель данных разделена на «уровни дерева».

Родитель -> (Многие) Дочерние элементы -> (Многие)Внуки

В табличном представлении я хотел бы показать все дочерние элементы родительского элемента в виде разделов, а GrandChildrens - в виде ячеек.Мне трудно понять, как решить эту проблему.

Буду признателен за любой совет.

РЕДАКТИРОВАТЬ Модель данных:

Parent:
name NSString*
Id NSNumber*
child NSSet* (set of childs)

Child:
name NSString*
childId NSNumber*
parent Parent*
childrensChilds NSSet* (set of childrensChilds)

ChildrensChild:
name NSString*
ChildrensChildId NSNumber*
parentChild *Child

FetchRequest:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Child" inManagedObjectContext:moc];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"ChildId" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent.parentId = %@", self.parentId];
[fetchRequest setPredicate:predicate];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:moc sectionNameKeyPath:nil cacheName:@"Childrens"];
self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

[fetchRequest release];
[theFetchedResultsController release];

Затем я хотел бы создать заголовки разделов с именами Child и ячейками, которые будут названы в честь childrenschild.

1 Ответ

0 голосов
/ 23 мая 2011

При использовании контроллера результатов выборки (FRC) с табличным представлением вы устанавливаете для объекта выборки тот объект, который будет заполнять строки.В конце концов, разделы являются необязательными, но строки всегда требуются.

Первое, что вам нужно сделать, это установить взаимные отношения в вашей модели данных следующим образом:

Parent<-->>Child<-->>GrandChild

... это позволяет вам пересечь объект, начиная с любой сущности, например, еслиу вас есть объект Grandchild, вы используете путь к ключу parentChild.parent (или как вы называете отношения) для достижения связанного объекта Parent путем прохождения объекта Child.

Чтобы настроить представление таблицы по своему усмотрению, вы должны установить для объекта выборки значение GrandChild, для предиката что-то вроде parentChild.parent.id=%@, а затем для FRC sectionNameKeyPath установить значение parentChild.name.

Однако вы, вероятно, хотите переосмыслить весь свой дизайн.Более простая модель данных для древовидной структуры была бы:

Person{
  name:string
  id:number
  parent<<-->Person.children
  children<-->>Person.parent
}

Внуком, являющимся ребенком, два хода вниз, а дедушкой - родителем два хода вверх.Если у вас есть какой-то конкретный объект Person, отображение в виде таблицы будет тривиальным.Имена разделов будут представлять собой отсортированный массив отношений 'children', а строки - это отсортированные массивы собственных дочерних элементов каждого ребенка.

Вам бы вообще пришлось возиться с заловами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...