Как вы можете избежать вставки повторяющихся записей? - PullRequest
3 голосов
/ 20 августа 2010

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

Однако я действительно хочу убедиться, что я не вставляю дубликаты (у объектов есть отметка даты, которая делает их уникальными, и я надеюсь использовать их для проверки уникальности). Я действительно не хочу зацикливаться на каждом объекте, делать выборку, а затем вставлять, если ничего не найдено, так как это очень ухудшит производительность ...

Мне интересно, есть ли более простой способ сделать это? Возможно, "группа" на мои объекты в памяти ???? Это возможно?

Ответы [ 3 ]

5 голосов
/ 20 августа 2010

На ваш вопрос уже есть ответ. Вам нужно зацикливаться на них, искать их, если они существуют, обновлять; в противном случае вставьте. Другого пути нет.

Поскольку вы отбираете одно значение, вы можете выбрать все соответствующие объекты одновременно, установив предикат:

[myFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"timestamp in %@", myArrayOfIncomingTimestamps]];

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

Также, несколько советов. Временная метка - это ужасно уникальный идентификатор. Я бы очень рекомендовал бы вам пересмотреть это.

1 голос
/ 20 августа 2010

метки времени не являются уникальными.Однако мы будем предполагать, что у вас есть уникальные идентификаторы (например, UUID / GUID / что угодно).

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

0 голосов
/ 20 августа 2010

Откуда вы знаете, что запись будет дубликатом? У вас есть первичный ключ или какой-то другой уникальный ключ? (Вам следует.) Проверьте этот ключ - если он уже существует в сущности в хранилище, затем обновите его, в противном случае вставьте его.

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