Xcode 项目中 Sqlite 数据库的位置
Where to locate Sqlite database in Xcode project
很抱歉重复一个问题,虽然略有不同,但我已经尝试了所有方法,搜索了这个论坛和 google 但无法解决这个问题。我有一个 Sqlite 数据库(只有 20kb 大小),我想在使用 Xcode 的 Swift 4 项目中使用它。我已将数据库(一个 .db 文件)放在 Xcode 保存我的项目的文件夹中,但是当我 运行 应用程序时,我得到 'no such table error'。按照调试屏幕中的文件路径将我带到一个 0kb 的文件,即空文件。我以为我已经通过使用路径名(即 FileManager.default.fileExists(atPath: "/Users/...") 解决了这个问题,但它不适用于我的 iPhone (仅在模拟器中)所以我已经回去尝试使用 URL 方法。我已经复制了代码的主要部分,但我怀疑前几行有问题或者我没有提交 .db文件放在正确的位置。我已将它添加到项目检查器中,它作为目标与项目相关联,并显示在构建阶段屏幕的复制包资源位下。我真的在这里很挣扎,所以非常感谢任何帮助.
//Function to open Cities database, add cities to array, sort alphabetically and then append "Please select city" at the start of the array
func populatePickerView() {
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let databaseURL = fileURL.appendingPathComponent("Wanderer.db")
let database = FMDatabase(path: databaseURL.absoluteString)
guard database.open() else {
print("Unable to open database")
return
}
do {
let cities:FMResultSet = try database.executeQuery("SELECT City from Cities", values: nil)
while cities.next() {
if let result = cities.string(forColumn: "City") {
cityData.append(result)
}
}
} catch {
print("OOPS, some sort of failure")
}
cityData = cityData.sorted(by: <)
cityData.insert("Please select city", at: 0)
}
如果您将数据库拖放到 Xcode 项目结构中 "copy items if needed" 并选择了目标,则您的数据库位于此处:
let databaseInMainBundleURL = Bundle.main.resourceURL?.appendingPathComponent("Wanderer.db")
如果您只想读取数据,这没问题,因为主包是只读的。
如果您想在数据库中保存一些内容,您需要将数据库复制到文档目录。
您可以使用此功能检查您的数据库是否存在于文档目录中,并在需要时进行复制。
func copyDatabaseIfNeeded(_ database: String) {
let fileManager = FileManager.default
let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
guard documentsUrl.count != 0 else {
return
}
let finalDatabaseURL = documentsUrl.first!.appendingPathComponent("\(database).db")
if !( (try? finalDatabaseURL.checkResourceIsReachable()) ?? false) {
print("DB does not exist in documents folder")
let databaseInMainBundleURL = Bundle.main.resourceURL?.appendingPathComponent("\(database).db")
do {
try fileManager.copyItem(atPath: (databaseInMainBundleURL?.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)")
}
}
并用于:
copyDatabaseIfNeeded("Wanderer")
之后您就可以使用您的 populatePickerView
功能了。
很抱歉重复一个问题,虽然略有不同,但我已经尝试了所有方法,搜索了这个论坛和 google 但无法解决这个问题。我有一个 Sqlite 数据库(只有 20kb 大小),我想在使用 Xcode 的 Swift 4 项目中使用它。我已将数据库(一个 .db 文件)放在 Xcode 保存我的项目的文件夹中,但是当我 运行 应用程序时,我得到 'no such table error'。按照调试屏幕中的文件路径将我带到一个 0kb 的文件,即空文件。我以为我已经通过使用路径名(即 FileManager.default.fileExists(atPath: "/Users/...") 解决了这个问题,但它不适用于我的 iPhone (仅在模拟器中)所以我已经回去尝试使用 URL 方法。我已经复制了代码的主要部分,但我怀疑前几行有问题或者我没有提交 .db文件放在正确的位置。我已将它添加到项目检查器中,它作为目标与项目相关联,并显示在构建阶段屏幕的复制包资源位下。我真的在这里很挣扎,所以非常感谢任何帮助.
//Function to open Cities database, add cities to array, sort alphabetically and then append "Please select city" at the start of the array
func populatePickerView() {
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let databaseURL = fileURL.appendingPathComponent("Wanderer.db")
let database = FMDatabase(path: databaseURL.absoluteString)
guard database.open() else {
print("Unable to open database")
return
}
do {
let cities:FMResultSet = try database.executeQuery("SELECT City from Cities", values: nil)
while cities.next() {
if let result = cities.string(forColumn: "City") {
cityData.append(result)
}
}
} catch {
print("OOPS, some sort of failure")
}
cityData = cityData.sorted(by: <)
cityData.insert("Please select city", at: 0)
}
如果您将数据库拖放到 Xcode 项目结构中 "copy items if needed" 并选择了目标,则您的数据库位于此处:
let databaseInMainBundleURL = Bundle.main.resourceURL?.appendingPathComponent("Wanderer.db")
如果您只想读取数据,这没问题,因为主包是只读的。
如果您想在数据库中保存一些内容,您需要将数据库复制到文档目录。
您可以使用此功能检查您的数据库是否存在于文档目录中,并在需要时进行复制。
func copyDatabaseIfNeeded(_ database: String) {
let fileManager = FileManager.default
let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
guard documentsUrl.count != 0 else {
return
}
let finalDatabaseURL = documentsUrl.first!.appendingPathComponent("\(database).db")
if !( (try? finalDatabaseURL.checkResourceIsReachable()) ?? false) {
print("DB does not exist in documents folder")
let databaseInMainBundleURL = Bundle.main.resourceURL?.appendingPathComponent("\(database).db")
do {
try fileManager.copyItem(atPath: (databaseInMainBundleURL?.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)")
}
}
并用于:
copyDatabaseIfNeeded("Wanderer")
之后您就可以使用您的 populatePickerView
功能了。