Как сохранить упорядоченную таблицу с Core Data (или SQL) с помощью вставок / удалений? - PullRequest
7 голосов
/ 05 сентября 2010

Этот вопрос относится к базовым данным, но, если я не ошибаюсь, он в равной степени относится и к более общему случаю SQL.

Я хочу вести упорядоченную таблицу с использованием базовых данных свозможность для пользователя:

  • изменить порядок строк
  • вставить новые строки в любом месте
  • удалить любую существующую строку

Какие данные лучшемодель для этого?Я вижу два способа:

1) Моделировать его как массив: я добавляю свойство int position к своей сущности

2) Моделировать его как связанный список: я добавляю дваотношения «один к одному», next и previous от моей сущности к себе

1) упрощают сортировку, но болезненно вставлять или удалять, так как вам нужно обновить position всехобъекты, которые идут после

2), позволяют легко вставлять или удалять, но очень трудно сортировать.На самом деле, я не думаю, что знаю, как выразить дескриптор сортировки (предложение SQL ORDER BY) для этого случая.

Теперь я могу представить вариант 1):

3) добавить свойство int ordering к сущности, но вместо того, чтобы считать его по одному, пусть оно будет считать 100 на 100 (например).Тогда вставка так же проста, как и поиск любого числа между порядком предыдущего и следующего существующих объектов.Дорогое перенумерация должна происходить только после заполнения 100 лунок.Если сделать это свойство float, а не int, это сделает его еще лучше: почти всегда можно найти новый float на полпути между двумя поплавками.

Я на правильном пути с решением 3), или есть что-то умнее

Ответы [ 2 ]

4 голосов
/ 05 сентября 2010

Если порядок является произвольным, т. Е. Не присущ моделируемым данным, у вас нет другого выбора, кроме как добавить атрибут или отношение для поддержания порядка.

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

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

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

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

Тщательно подумайте, прежде чем добавлять заказ в модель, когда она вам может не понадобиться.

0 голосов
/ 21 сентября 2012

Начиная с iOS 5, вы можете (и должны) использовать NSOrderedSet и его изменяемый подкласс. → Примечания к выпуску основных данных для OS X v10.7 и iOS 5.0

См. Принятый ответ на Как сохранить упорядоченный список в Базовых данных .

...