将 SQLite 3 数据库连接到 Swift
Connecting SQLite 3 Database to Swift
我正在尝试在我的 SwiftUI 代码中打开一个 SQLite3 数据库,以访问包中的文件路径,我正在使用以下函数;
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
.first!
但是我一直收到错误 unable to open database file (code: 14)
,但在尝试 运行 几次后,我意识到 path
的倒数第二个文件夹每次都不同 运行 代码。我怎样才能找到一个不会改变的包的路径,这样代码才能工作?
这些是路径如何变化的一些例子:
倒数第二个文件夹命名为:CAC91DB3-E264-436F-89A8-1E3D76C4DC56
/Library/Developer/CoreSimulator/Devices/EFD14A1B-7207-4840-9ACE-8E44A269CC70/data/Containers/Data/Application/CAC91DB3-E264-436F-89A8-1E3D76C4DC56/Documents
倒数第二个文件夹命名为:0A23051F-9362-4B4D-B49B-BE0F028384DC
/Library/Developer/CoreSimulator/Devices/EFD14A1B-7207-4840-9ACE-8E44A269CC70/data/Containers/Data/Application/0A23051F-9362-4B4D-B49B-BE0F028384DC/Documents
编辑:这是我正在使用的代码:
Import swiftUI
Import Foundation
Import SQLite
func openDatabase() {
let ProductID = Expression<Int64>("ProductID")
let Name = Expression<String>("Name")
let Calories = Expression<Double>("Calories")
let Protein = Expression<Double>("Protein")
let Carbs = Expression<Double>("Carbs")
let Fats = Expression<Double>("Fats")
let Weight = Expression<Double>("Weight")
let Category = Expression<String>("Category")
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentDirectory.appendingPathComponent("Database.db")
let db = try! Connection("\(fileURL)")
let Products = Table("Products")
//Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: no such table: Products (code: 1)
for prID in try! db.prepare(Products) {
print("productid: \(prID[ProductID]), name: \(prID[Name]), calories: \(prID[Calories]), protein: \(prID[Protein]), carbs: \(prID[Carbs]), fats: \(prID[Fats]), weight: \(prID[Weight]), category: \(prID[Category])")
DatabaseTest().dataTest.append(Product(name: prID[Name], calories: prID[Calories], protein: prID[Protein], carbs: prID[Carbs], fats: prID[Fats], weight: prID[Weight]))
}
}
关于 sqlite.swift
参考的澄清:
(https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md)
这是因为 iOS 中的所有应用程序都是沙盒化的。没有办法避免这种情况。您无法保存完整路径。每次启动应用程序时它都会改变。您只需要保存您的文件名及其父目录。每次需要访问它们时,使用它们构造一个新的 fileURL and/or 路径。
edit/update:
如果您的文件位于 App Bundle 中:
let databaseURL = Bundle.main.url(forResource: "Database", withExtension: "db")!
注意:如果您需要数据库路径,您必须获取 fileURL 路径 属性 而不是 absoluteString。最后但同样重要的是,Bundle 是只读的。您需要 move/copy 您的数据库到另一个目录 () 才能修改它。
let databasePath = databaseURL.path
我正在尝试在我的 SwiftUI 代码中打开一个 SQLite3 数据库,以访问包中的文件路径,我正在使用以下函数;
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
.first!
但是我一直收到错误 unable to open database file (code: 14)
,但在尝试 运行 几次后,我意识到 path
的倒数第二个文件夹每次都不同 运行 代码。我怎样才能找到一个不会改变的包的路径,这样代码才能工作?
这些是路径如何变化的一些例子:
倒数第二个文件夹命名为:CAC91DB3-E264-436F-89A8-1E3D76C4DC56
/Library/Developer/CoreSimulator/Devices/EFD14A1B-7207-4840-9ACE-8E44A269CC70/data/Containers/Data/Application/CAC91DB3-E264-436F-89A8-1E3D76C4DC56/Documents
倒数第二个文件夹命名为:0A23051F-9362-4B4D-B49B-BE0F028384DC
/Library/Developer/CoreSimulator/Devices/EFD14A1B-7207-4840-9ACE-8E44A269CC70/data/Containers/Data/Application/0A23051F-9362-4B4D-B49B-BE0F028384DC/Documents
编辑:这是我正在使用的代码:
Import swiftUI
Import Foundation
Import SQLite
func openDatabase() {
let ProductID = Expression<Int64>("ProductID")
let Name = Expression<String>("Name")
let Calories = Expression<Double>("Calories")
let Protein = Expression<Double>("Protein")
let Carbs = Expression<Double>("Carbs")
let Fats = Expression<Double>("Fats")
let Weight = Expression<Double>("Weight")
let Category = Expression<String>("Category")
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentDirectory.appendingPathComponent("Database.db")
let db = try! Connection("\(fileURL)")
let Products = Table("Products")
//Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: no such table: Products (code: 1)
for prID in try! db.prepare(Products) {
print("productid: \(prID[ProductID]), name: \(prID[Name]), calories: \(prID[Calories]), protein: \(prID[Protein]), carbs: \(prID[Carbs]), fats: \(prID[Fats]), weight: \(prID[Weight]), category: \(prID[Category])")
DatabaseTest().dataTest.append(Product(name: prID[Name], calories: prID[Calories], protein: prID[Protein], carbs: prID[Carbs], fats: prID[Fats], weight: prID[Weight]))
}
}
关于 sqlite.swift
参考的澄清:
(https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md)
这是因为 iOS 中的所有应用程序都是沙盒化的。没有办法避免这种情况。您无法保存完整路径。每次启动应用程序时它都会改变。您只需要保存您的文件名及其父目录。每次需要访问它们时,使用它们构造一个新的 fileURL and/or 路径。
edit/update:
如果您的文件位于 App Bundle 中:
let databaseURL = Bundle.main.url(forResource: "Database", withExtension: "db")!
注意:如果您需要数据库路径,您必须获取 fileURL 路径 属性 而不是 absoluteString。最后但同样重要的是,Bundle 是只读的。您需要 move/copy 您的数据库到另一个目录 (
let databasePath = databaseURL.path