Как я могу устранить предупреждающее сообщение «ОШИБКА В КЛИЕНТЕ libsqlite3.dylib: целостность базы данных нарушена нарушением API» в Sqlite.swift?

я использую Sqlite.swift

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

но есть предупреждающее сообщение.

[logging] BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by API violation: vnode unlinked while in use:

я знаю, что речь идет о целостности ... но я не знаю, как я могу решить эту проблему.

вот мой код. когда вы нажимаете кнопку «Создать», функция createDB() будет работать.

    func createDB() {
        print("CREATE DB")
        do {

            let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

            let fileUrl = documentDirectory.appendingPathExtension("test").appendingPathExtension("sqlite3")

            // if there is existing db, then remove it
            let fileMng = FileManager.default
            if fileMng.fileExists(atPath: fileUrl.path) {
                do {
                    try fileMng.removeItem(at: fileUrl)
                    print("remove db file because you already have db")
                }
                catch {
                    print("Remove DB Error", error)
                }
            }

            let database = try Connection(fileUrl.path)
            self.database = database
            print("Successfully create database")
        }
        catch {
            print("Create DB Error : ", error)
        }
    }

и это лог.

CREATE DB
remove db file because you already have db
Successfully create database
CREATE DB
remove db file because you already have db
2020-04-13 23:01:36.866156+0900 RealmTest[40604:6719249] [logging] BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by API violation: vnode unlinked while in use: {directory-address-in-my-local-computer}
2020-04-13 23:01:36.866272+0900 RealmTest[40604:6719249] [logging] invalidated open fd: 5 (0x11)
Successfully create database

Я узнал, что это не ошибка, а предупреждение. и когда я перезапускаю приложение, операция удаления работает очень хорошо без предупреждающего сообщения. но когда я второй раз нажимаю кнопку «Создать», появляется предупреждающее сообщение.

Я не удалял базу данных, когда выключал приложение. поэтому, я думаю, ясно, что база данных будет удалена при повторном включении приложения. поэтому я не знаю, в чем проблема с созданием БД дважды. Я был бы очень признателен, если бы вы могли сказать мне! Пожалуйста, дай мне знать.


person doori    schedule 13.04.2020    source источник


Ответы (1)


Вы должны убедиться, что перед вызовом метода createDB() все ожидающие соединения с вашей базой данных закрыты. У вас есть по крайней мере одно такое соединение в вашем коде, в self.database, поэтому вам нужно установить его равным нулю.

self.database = nil
self.createDB()

(В качестве альтернативы вы можете сделать это внутри createDB())

person Gereon    schedule 13.04.2020
comment
omg благодаря вашему быстрому и доброму объяснению, я сэкономил время. еще раз большое спасибо - person doori; 13.04.2020
comment
спасибо за быстрый и понятный ответ :) - person Shahriar Nasim Nafi; 16.01.2021