Ошибка области: свойство первичного ключа «Product.upc» имеет повторяющиеся значения после переноса.

У меня есть предварительное приложение Swift, использующее Realm. У него есть класс с именем Product с первичным ключом, установленным как «upc». Я изменил класс, добавив некоторые дополнительные переменные, а затем попытался запустить миграцию. Теперь, когда я пытаюсь запустить приложение, я получаю следующую ошибку:

Fatal error: 'try!' expression unexpectedly raised an error: 
Error Domain=io.realm Code=1 "Primary key property 'Product.upc' has duplicate values after migration."

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

Я попытался удалить файл области и начать все сначала, но я что-то упускаю, так как это просто повторяется после того, как я снова запускаю все это.

Product класс:

    @objc dynamic var upc: Int = 0
    @objc dynamic var itemDescription: String = ""
    @objc dynamic var originalQty: Int = 0
    //@objc dynamic var totalOriginalCost: String
    //@objc dynamic var totalOriginalRetail: String
    //@objc dynamic var vendorStyle: String
    @objc dynamic var color: String = ""
    @objc dynamic var size: String = ""
    //@objc dynamic var clientCost: String
    //@objc dynamic var totalClientCost: String
    //@objc dynamic var division: String
    //@objc dynamic var departmentName: String
    //@objc dynamic var vendorName: String
    @objc dynamic var image: String = ""
    @objc dynamic var imageSlot1: String = ""
    @objc dynamic var imageSlot2: String = ""
    @objc dynamic var imageSlot3: String = ""
    @objc dynamic var imageSlot4: String = ""
    @objc dynamic var imageSlot5: String = ""
    @objc dynamic var imageSlot6: String = ""
    @objc dynamic var imageSlot7: String = ""
    @objc dynamic var imageSlot8: String = ""
    @objc dynamic var imageSlot9: String = ""
    @objc dynamic var imageSlot10: String = ""
    @objc dynamic var imageSlot11: String = ""
    @objc dynamic var imageSlot12: String = ""
    @objc dynamic var imageSlot13: String = ""
    @objc dynamic var imageSlot14: String = ""
    @objc dynamic var imageSlot15: String = ""
    @objc dynamic var price: Double = 0
    @objc dynamic var shipping: Double = 0
    @objc dynamic var brand: String = ""
    @objc dynamic var style: String = ""
    @objc dynamic var sleeveStyle: String = ""
    @objc dynamic var sleeveLength: String = ""


    override static func primaryKey() -> String? {
        return "upc"
    }
    }

migration код:

// bump the schema version to 1
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
    migration.enumerateObjects(ofType: Product.className()) { oldObject, newObject in
        if (oldSchemaVersion < 1) {
        }
    }
})
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=1 "Primary key property 'Product.upc' has duplicate values after migration."

Обновление: я попробовал следующий код для сброса схемы, но потом получаю новые ошибки:

var config = Realm.Configuration() config.deleteRealmIfMigrationNeeded = true
error:
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors:
- Property 'Product.upc' has been made required.
- Property 'Product.itemDescription' has been made required.
- Property 'Product.originalQty' has been made required.
- Property 'Product.color' has been made required.
- Property 'Product.size' has been made required.
- Property 'Product.image' has been made required.
- Property 'Product.imageSlot1' has been made required.
- Property 'Product.imageSlot2' has been made required.
- Property 'Product.imageSlot3' has been made required.
- Property 'Product.imageSlot10' has been added.
- Property 'Product.imageSlot5' has been added.
- Property 'Product.imageSlot6' has been made required.
- Property 'Product.imageSlot7' has been made required.
- Property 'Product.imageSlot8' has been made required.
- Property 'Product.imageSlot9' has been made required.
- Property 'Product.imageSlot4' has been added.
- Property 'Product.imageSlot11' has been made required.
- Property 'Product.imageSlot12' has been made required.
- Property 'Product.imageSlot13' has been made required.
- Property 'Product.imageSlot14' has been made required.
- Property 'Product.imageSlot15' has been made required.
- Property 'Product.price' has been made required.
- Property 'Product.shipping' has been made required.
- Property 'Product.brand' has been made required.
- Property 'Product.style' has been made required.
- Property 'Product.sleeveStyle' has been made required.
- Property 'Product.sleeveLength' has been made required.

person Chris    schedule 21.08.2019    source источник
comment
Если вы добавляете или удаляете свойства объекта, вам не нужно перечислять эти объекты в блоке миграции. Он автоматически обнаружит эти изменения и соответствующим образом обновит схему. Итак, если вы удалите все файлы области (их больше 1), сбросите свою схему до 0 и повторно запустите приложение, вы все равно получите эту ошибку? Вы уверены, что удалили файлы блокировки и управления?   -  person Jay    schedule 21.08.2019
comment
Я удалил перечисление, удалил все файлы области, включая блокировку и управление, затем сбросил схему на 0 и запустил приложение. Я получаю еще одну фатальную ошибку, которую я вставил выше о классе Product, и теперь его объекты стали обязательными. Ошибка также говорит о том, что требуется миграция. Поэтому я поднял схему до 1 и снова запустил. Ошибка о повторяющихся ключах возвращается.   -  person Chris    schedule 22.08.2019
comment
Это область запроса или полной синхронизации или просто локальная? а песочница включена или выключена?   -  person Jay    schedule 22.08.2019
comment
только локальный и песочница отключена.   -  person Chris    schedule 10.09.2019
comment
Код, выдающий ошибку, отсутствует в вопросе.   -  person Jay    schedule 11.09.2019


Ответы (1)


Удалите все данные из вашей базы данных, затем обновите схему Добавить, обновите файл после обновления, ваша база данных должна установить новую версию

Код для версии обновления

export default new Realm({
  schema: [class1, class2, classN],
  schemaVersion: 2 // set new version 
});

Код для удаления всех данных

try {
      realm.beginTransaction();
      realm.deleteAll();
      realm.commitTransaction();
 } catch (error) {
     console.log(error);
 }
person Zanyar J.Ahmed    schedule 11.01.2021