Удаление дублирующихся объектов в базовых данных (iphone) - PullRequest
2 голосов
/ 07 октября 2009

В своем приложении для iPhone я предоставляю пользователям возможность просматривать новости отрасли. Я получаю этот список в виде XML-файла с моего сервера. Разбор и вставка данных xml в мой репозиторий Core Data не составляет никакого труда, но в некоторых случаях я могу получить дубликаты записей новостей.

Я подумал, что хорошим решением было бы вставить все обновления, когда я обрабатываю канал XML, а затем удалить все дубликаты. Но я не могу понять, как это сделать. Как удалить дубликаты объектов в платформе Apple Core Data?

Чтобы сделать этот бетон, скажем, у меня есть новость:

Новости - uniqueId (устанавливается внешней системой) - заглавие - newsText

Есть ли какой-нибудь лаконичный способ сказать Core Data просто удалить дубликаты объектов, где дубликат объекта определяется как объект с тем же «uniqueId»? То есть, не делая явной выборки в моем коде и не вставляя объект, если объект с таким же «uniqueId» уже существует?

Ответы [ 2 ]

8 голосов
/ 07 октября 2009

Базовые данные не поддерживают удаление «дубликатов», потому что единственное понятие идентичности объекта - это NSManagedObjectID, назначенный каждому объекту. Поскольку вы не можете установить этот идентификатор вручную, вы не сможете использовать его для уникальности при вставке. У вас есть (как минимум) два варианта:

  1. Сделайте выборку на вкладыше, как вы предлагаете. Тестирование покажет, является ли это слишком медленным: пока вы не протестируете его, не думайте, что это решение не будет работать. Вы можете улучшить производительность, выполнив всю вставку в NSInMemoryPersistentStore, а затем перенеся это постоянное хранилище в постоянное (на диске) хранилище для сохранения. Если вы можете сохранить все вставленные объекты в памяти, это будет очень быстро.

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

В обоих случаях объем кода минимален. Инструменты Core Data в Instruments.app станут вашим лучшим инструментом для оценки эффективности обоих подходов.

0 голосов
/ 22 июня 2010

Если вы создадите атрибут uniqueId в Core Data UNIQUE и НЕ опционально, он не будет копировать тот же элемент снова.

...