Swift Realm: - добавление удаленного или недействительного объекта в Realm запрещено - PullRequest
0 голосов
/ 24 октября 2019

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

Добавление удаленного или недействительного объектаобъект в царство не допускается

let realm = try! Realm()
        let objFolder = realm.objects(FolderColor.self)
        do{

            try realm.write {
                realm.delete(objFolder)
                for obj in arrFolderColors {
                    realm.add(obj)
                }
            }
        }
        catch{}

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Мне нравится другой ответ, но я думаю, что здесь происходит, у вас есть класс var

@objc dynamic var folderColorResults = Results<FolderColor>

, и в какой-то момент вы заполнили этот var некоторыми объектами FolderColor

self.folderColorResults = realm.objects(FolderColor.self).filter("color == 'blue'")

Итак, когда вы вызываете код в вопросе, он удаляет все объекты FolderColor из Realm - когда это происходит, результаты folderColorResults var также обновляются (все объекты удаляются).

Поэтомунет объектов для обратной записи на диск.

Помните, что Realm - это живая база данных, и объекты Results всегда синхронизируются с фактическими данными;изменяйте объект в одном месте, он изменяет его везде, где используется объект.

Предлагаемое исправление заключается в приведении folderColorResults к массиву.

let myArray = Array(self.folderColorResults)

, который отключает эти объекты от области. и они не будут обновляться.

Конечно, я могу быть совершенно не прав в этом предположении, поэтому я могу обновить в дальнейшем, если будет предоставлена ​​дополнительная информация.

1 голос
/ 24 октября 2019

Объекты Realm - это просто указатели на свои данные в базе данных Realm. Когда вы звоните realm.delete, вы полностью удаляете содержимое из памяти и диска. Сам объект Realm все еще находится в памяти, но вы не можете вызывать какие-либо свойства или пытаться повторно добавить его.

Существует свойство object.invalidated, которое можно использовать, чтобы проверить, был ли объект удален перед вами. попробуйте добавить его в Realm, чтобы избежать случайного запуска этого исключения.

Я бы порекомендовал вам пересмотреть свою логику, чтобы не вызывать realm.delete. Если он находится в массиве, вы можете просто удалить его из массива, но сохранить его в базе данных.

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