swift - 使用 https://cocoapods.org/pods/SQLite.swift 附加两个 sqlite 数据库的问题
问题描述
我正在使用stephencelis/SQLite.swift并尝试在运行时附加 2 个数据库:
附加数据库 \'(databasePath.Local)\' AS LOCAL_USER_DB;
//
// DatabaseWrapper.swift
// ...
//
import UIKit
import SQLite
class DatabaseWrapper {
// MARK: - Constants
struct databaseName {
static let Interface: String = "app_interface_sqlite3_db.db3"
static let Local: String = "app_local_sqlite3_db_local.db3"
}
struct databasePath {
static let path = NSSearchPathForDirectoriesInDomains(
.documentDirectory, .userDomainMask, true
).first!
static let Interface = "\(path)/\(databaseName.Interface)"
static let Local = "\(path)//\(databaseName.Local)"
static let Interface_Bundle: String = Bundle.main.path(forResource: "app_interface_sqlite3_db", ofType: "db3") ?? ""
static let Local_Bundle: String = Bundle.main.path(forResource: "app_local_sqlite3_db_local", ofType: "db3") ?? ""
}
// MARK: Copy Databases
public static func copyDatabasesIfNeeded() {
copyDatabaseIfNeeded(databaseName: databaseName.Interface)
copyDatabaseIfNeeded(databaseName: databaseName.Local)
}
public static func copyDatabaseIfNeeded(databaseName: String) {
print("PATH: \(databasePath.Interface)")
// Move database file from bundle to documents folder
let fileManager = FileManager.default
let documentsUrl = fileManager.urls(for: .documentDirectory,
in: .userDomainMask)
guard documentsUrl.count != 0 else {
return // Could not find documents URL
}
let finalDatabaseURL = documentsUrl.first!.appendingPathComponent(databaseName)
if !( (try? finalDatabaseURL.checkResourceIsReachable()) ?? false) {
print("DB does not exist in documents folder")
let documentsURL = Bundle.main.resourceURL?.appendingPathComponent(databaseName)
do {
try fileManager.copyItem(atPath: (documentsURL?.path)!, toPath: finalDatabaseURL.path)
} catch let error as NSError {
print("Couldn't copy file to final location! Error:\(error.description)")
}
} else {
print("Database file found at path: \(finalDatabaseURL.path)")
}
}
// MARK: - Attach Local User Database TESTS
public static func attachDatabase() {
do {
// if the database connection works
let db = try Connection(databasePath.Interface);
let attachStr = "ATTACH DATABASE \'\(databasePath.Local)\' AS LOCAL_USER_DB;"
try db.execute(attachStr)
} catch {
// handle error
print("Unexpected error: \(error).")
}
}
public static func checkIfDatabase2IsAttached() -> Bool {
var isAllreadyAttached = false
do {
// if the database connection works
let db = try Connection(databasePath.Interface);
// seq, name, file
var row_counter = 0
for row in try db.prepare("PRAGMA database_list;") {
print("\n\n----------\row: \(row)\n----------\n\n")
row_counter += 1
}
isAllreadyAttached = (row_counter == 2) ? true : false
} catch {
// handle error
print("Unexpected error: \(error).")
}
return isAllreadyAttached
}
public static func testIfDatabaseWasAttached() {
do {
// if the database connection works
let db = try Connection(databasePath.Interface);
for row in try db.prepare("SELECT * FROM LOCAL_USER_DB.users;") {
print("row: \(row)")
}
} catch {
// handle error
print("Unexpected error: \(error).")
}
}
// ...
}
当我打电话
// Copy both databases if needed
DatabaseWrapper.copyDatabasesIfNeeded()
DatabaseWrapper.attachDatabase()
if (DatabaseWrapper.checkIfDatabase2IsAttached()) {
print("ATTACHED")
} else {
print("NOT ATTACHED YET")
}
DatabaseWrapper.testIfDatabaseWasAttached()
不幸的是,我不工作,也没有收到任何错误消息。
在领事馆我得到日志:
---------- ow: [Optional(0), Optional("main"), Optional("..../Developer/CoreSimulator/Devices/F93B5F0C-87D0-439C-ACB9-B1C6B5B7BE60/data /Containers/Data/Application/BB9587A1-2512-4003-ABC0-8AB1A7F6B4AF/Documents/app_interface_sqlite3_db.db3")]
尚未附加意外错误:没有这样的表:LOCAL_USER_DB.users(代码:1)。
有没有人有线索,以前做过这个或有人帮助我吗?
提前致谢。
解决方案
如我所见,问题与testIfDatabaseWasAttached()
. 你确定你的桌子有名字LOCAL_USER_DB.users
吗?您可以使用此代码 - 我已经检查并从表中获取用户LOCAL_USER_DB.users
(表的名称很奇怪,但可以)。
public static func testIfDatabaseWasAttached() {
do {
let db = try Connection(databasePath.Interface);
for element in try db.prepare(Table("LOCAL_USER_DB.users")) {
print(element)
}
} catch {
// handle error
print("Unexpected error: \(error).")
}
}
您应该确保您的表格名称LOCAL_USER_DB.users
和错误说明了您的问题。db的这个结构:
PS当我运行您的代码时-在 中创建了2个数据库[.documents]
,但它们完全是空的(根本没有数据,只有两个数据库)。我建议检查流程逻辑
推荐阅读
- c# - 如何使用 IEqualityComparer 加快多个字段的比较?
- webpack - 带有popper的引导工具提示无法通过webpack工作
- macos - 无法启动为 App Store 提交上传的 MAC 应用程序
- python - 圆形 Python 列表项,每个项都有不同的小数位
- jenkins - 如何在流水线脚本中使用 Jenkins 节点环境变量?
- python - 如何忽略 - 错误:系统无法找到指定的注册表项或值
- c# - 从生产环境获取日志
- javascript - × 从 javascript 添加不可点击?
- python - 朴素贝叶斯的工作原理
- php - Laravel - 在 cron 作业中使用“睡眠”命令