Моделирование пользовательских списков с помощью Core Data / Bindings - PullRequest
3 голосов
/ 05 апреля 2011

Я работаю над учебным проектом вокруг Core Data на OS X. У меня есть сущность (Foo) в хранилище данных, и в пользовательском интерфейсе я использую NSArrayController с привязками, чтобы поместить некоторое поле (имя) поляFoo объекты в NSTableView, где пользователь может добавлять / удалять / переименовывать (и, возможно, переупорядочивать) элементы.

Как вы знаете, хранилище Core Data неупорядочено.Тем не менее, я хотел бы навести порядок с точки зрения пользователя.Например, добавление новой строки в табличное представление исправляет этот новый Foo в конце списка и т. Д. Если таблица позволяет изменять порядок, этот порядок сохраняется.

Я полагаю, что я должен выполнить это, добавив некоторые скрытые(т. е. пользователь никогда не встречает его) «порядковое» поле для сущности Foo, что нормально.Я пытаюсь выяснить:

  1. Где находится правильное место для установки этого «порядкового» поля для новых предметов?Прямо сейчас кнопка вызывает действие add: на контроллере массива, а привязки обрабатывают все остальное магическим образом.(Мне понадобится доступ к количеству элементов, чтобы установить его правильно.)
  2. Где находится правильное место для исправления ординалов всего набора результатов при удалении или переупорядочении?
  3. Предполагается, что все объекты вхранилище имеет разумный порядковый атрибут, что я должен сделать с соединениями пользовательского интерфейса, чтобы в табличном представлении отображались результаты, отсортированные по этому порядковому номеру?Это то, что я могу сделать исключительно с привязками?Нужно ли подкласс ... что-то?

Такое чувство, что это достаточно распространенный сценарий, и люди здесь могут иметь готовый ответ.Я новичок в Core Data и привязках - пытаюсь нащупать свой путь.Не нужен код;указатели в правильном направлении было бы здорово.Спасибо.

1 Ответ

2 голосов
/ 06 апреля 2011

Самый простой способ сделать заказ - убедиться, что ваша сущность точно моделирует данные, которые действительно нужны пользователю.Помните, Core Data не является системой баз данных.Это система управления графами объектов с опциями сохранения.Объекты имеют поведение.Это означает, что вы можете поместить гораздо больше информации в Базовые Данные, чем обычно, просто для базы данных.

Большую часть времени упорядочение происходит естественным образом благодаря хорошему дизайну сущностей.Например, пользователь должен упорядочить объекты Foo по тому времени, когда они были добавлены на график.Следовательно, объект Foo нуждается в атрибуте creationDate.Просто привяжите дескриптор сортировки к атрибуту creationDate, и все готово.

Самая большая проблема - произвольный порядок, который не имеет ничего общего с моделируемыми данными.Мне нравится решать эту проблему с помощью легкого Order объекта, который относится к фактически заказанному объекту.

Foo{
    name:string
    creationDate:date
    order<-->Order.foo
}

Order{
    foo<-->Foo.order
    previous<-->Order.next
    next<-->Order.previous
}

Как видите, сущности Order функционируют как старый список связанных школ.Чтобы вставить в объект новый объект Foo, просто вставьте новый связанный объект Order между существующими объектами Order.Чтобы создать упорядоченный список, просто начните с объекта Order, атрибут которого previous равен nil, а затем пройдитесь по отношениям next, вытягивая каждое отношение foo по мере прохождения.

Есть и другие варианты.

Но опять же, дизайн сущностей всегда лучший.Сущность предназначена для моделирования / симуляции реального объекта, события или состояния.Если вы думаете о реальных вещах, которые хотите смоделировать, а затем включаете их в графы объектов и объектов, то довольно часто ваш порядок происходит естественным образом.

...