Как избежать получения «ошибки во время выполнения SQL: ограничение не удалось», когда я обновляю свой магазин данных SQLite Core?

Наше приложение позволяет пользователю выбрать местоположение из списка, который предоставляется API. Список обновляет редко и только путем добавления элементов, поэтому вместо того, чтобы воспользоваться API каждый раз, приложение поставляется с моментальным снимком в основном хранилище данных SQLite, и мы хотим, чтобы он периодически обновил список. Код для этого работает так работает:

  • Создание управляемого контекста объекта для потока
  • Получить полный список из API
  • для каждого:
    • Найти местоположение в контексте сопоставленным местоположением
    • , если не найдено, вставьте новый в контекст
    • Обновить местоположение с новой информацией
  • Сохранить контекст

при запуске с Пустая БД, это работает нормально. Однако, когда мы запускаем его во второй раз, это не удается во время сохранения с сообщением «Ошибка во время выполнения SQL: Confulaint Shife». Это делает это, даже если я ограничиваю его одному расположению. Если я включу отладку SQL, я вижу следующее:

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZLOCATION(Z_PK, Z_ENT, Z_OPT, ZGEOID, ZCOUNTY, ZCOUNTRYCODE, ZNAME, ZLATITUDE, ZLONGITUDE, ZLANGUAGECODE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: error: (19) constraint failed
CoreData: annotation: Disconnecting from sqlite database due to an error.

, то он снова отсоединяется и снова пытается несколько раз, прежде чем сдаваться.

Мой код определенно находит старые расположения, и объекты все действительны - или, по крайней мере, [Объект ValidateForupdate] возвращает да. Что означает ошибка? Есть ли способ выяснить, какое ограничение не удается?

Если я использую двоичный магазин, ошибка уходит - но двоичный магазин атомная и блоки для веков на пишетах. Похоже, ошибка в магазине SQLite - кто-нибудь нашел обходной путь?

8
задан Simon 30 September 2011 в 10:50
поделиться