在Xcode项目中查找Sqlite数据库的位置



很抱歉重复了一个问题,尽管略有不同,但我已经尝试了所有方法,搜索了这个论坛和谷歌,但无法解决这个问题。我有一个Sqlite数据库(只有20kb大小(,我想在Swift 4项目中使用Xcode。我已经把数据库(一个.db文件(放在Xcode保存我项目的文件夹中,但当我运行应用程序时,我会得到"没有这样的表错误"。按照调试屏幕中的文件路径,我会看到一个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项目结构中,并选择"如果需要,复制项目"和目标,则您的数据库位于此处:

let databaseInMainBundleURL = Bundle.main.resourceURL?.appendingPathComponent("Wanderer.db")

如果您只想读取数据,这将是好的,因为主捆绑包是只读的。

如果你想在数据库中保存一些东西,你需要将数据库复制到documents目录中。

您可以使用此功能来检查您的数据库是否存在于文档目录中,并在需要时进行复制。

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功能。

最新更新