如何解决 Sqlite.swift 中的警告消息 'BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by API violation'?
How can i resolve warning message 'BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by API violation' in Sqlite.swift?
我正在使用 Sqlite.swift
当我在模拟器中重新启动应用程序时,我想删除现有数据库并创建新数据库。 (因为正在初始化数据库...我更改了很多数据库列。)
但是有警告信息。
[logging] BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by API violation: vnode unlinked while in use:
我知道这与诚信有关...但我不知道如何解决这个问题。
这是我的代码。当您单击按钮 'Create' 时,func 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
我发现这不是错误,而是警告。当我重新启动应用程序时,删除操作工作得很好,没有警告消息。但是当我第二次单击按钮 'Create' 时,警告消息提醒。
我关闭应用程序时没有删除数据库。因此,我认为很明显,当应用程序再次打开时,数据库将被删除。所以我不知道两次创建数据库有什么问题。如果你能告诉我,我将不胜感激!请告诉我。
您需要确保在调用 createDB()
方法之前,已关闭与数据库的任何挂起连接。您的代码中至少有一个这样的连接,在 self.database
中,因此您需要将其设置为 nil。
self.database = nil
self.createDB()
(或者,你可以在 createDB()
里面)
我没有更好的解决方案,但值得一提的是,当我尝试在 [=13] 的 Google Drive 文件夹中删除并重新创建数据库时,我遇到了同样的错误=],但当我使用本地文件夹(例如我的主目录)时不会。
我正在使用 Sqlite.swift
当我在模拟器中重新启动应用程序时,我想删除现有数据库并创建新数据库。 (因为正在初始化数据库...我更改了很多数据库列。)
但是有警告信息。
[logging] BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by API violation: vnode unlinked while in use:
我知道这与诚信有关...但我不知道如何解决这个问题。
这是我的代码。当您单击按钮 'Create' 时,func 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
我发现这不是错误,而是警告。当我重新启动应用程序时,删除操作工作得很好,没有警告消息。但是当我第二次单击按钮 'Create' 时,警告消息提醒。
我关闭应用程序时没有删除数据库。因此,我认为很明显,当应用程序再次打开时,数据库将被删除。所以我不知道两次创建数据库有什么问题。如果你能告诉我,我将不胜感激!请告诉我。
您需要确保在调用 createDB()
方法之前,已关闭与数据库的任何挂起连接。您的代码中至少有一个这样的连接,在 self.database
中,因此您需要将其设置为 nil。
self.database = nil
self.createDB()
(或者,你可以在 createDB()
里面)
我没有更好的解决方案,但值得一提的是,当我尝试在 [=13] 的 Google Drive 文件夹中删除并重新创建数据库时,我遇到了同样的错误=],但当我使用本地文件夹(例如我的主目录)时不会。