我最近开始了一个iOS项目,需要使用一个独立的数据库,当有更新时,它将从互联网上下载。这是我的第一个iOS项目,所以我试图在设计下载机制之前使功能正常工作。
我选择了SQLite包装器SWLite.swift
(https://github.com/stephencelis/SQLite.swift)并准备好我的查询和表视图。但我无法连接到数据库。我在这里尝试了几乎所有其他问题/答案,但绝对没有成功。
例如,我将SQLite数据库放入Assets.xcassets
并尝试let path = Bundle.main.path(forResource: "myDb", ofType: "db")!
,然后应用程序崩溃(因为我得到nil
- 大概是因为路径不能位于)。同样,我尝试了其他人建议的内容,包括在我的Mac上创建一个文件夹,将文件放入其中,将.bundle
附加到文件夹名称,然后再将其放入资产... nil
。
有人可以提供建议吗?我看过Apple Docs并且找不到我想要的东西 - 再次,这是我的第一次,所以也许我做错了。
答案 0 :(得分:1)
您无法直接从手机上的sqlite文件中读取文件。您必须先将其复制到Documents文件夹并从那里开始阅读。这只需要做一次。移动它,
let path = Bundle.main.path(forResource: "DBName", ofType: "sqlite")
do{
try fileManger.copyItem(atPath: path!, toPath: dbPath)
}catch let error as NSError {
print("error occurred, here are the details:\n \(error)")
}
然后连接,你可以使用
let doumentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
let dbPath = doumentDirectoryPath.appendingPathComponent("DBName.sqlite")
答案 1 :(得分:0)
看起来您实际的主要问题是获取数据库文件的有效路径。如果数据库文件也位于Assets中,我也找不到任何使其工作的方法。因此,不要将数据库文件保存在Assets文件夹中,而是将其添加到当前目标的 Build Phases 设置中的 Copy Bundle Resources 列表中。 / strong>如果您的文件名为myDb.db
,则可以获取如下有效路径:
let dbUrl = Bundle.main.url(forResource: "myDb", withExtension: "db")!
let dbPath = dbUrl.path
可以立即访问数据库而不必(手动?)复制数据库。只需使用已经提到的SQLite.swift库:
db = try! Connection(dbPath)
注释: 由于问题有点老了,所以在询问时可能无法像这样访问数据库文件。但是,它确实可以正常工作。我尚未明确检查的唯一内容是写入数据库。不过至少有一个只读访问确实像超级按钮一样工作。
答案 2 :(得分:-1)
首先,除了文档文件夹之外,你永远不想把你的数据库放在其他任何地方。
这是使用SQLite.Swift的过程: -
// this is the path where your DB should be
let path = NSSearchPathForDirectoriesInDomains(
.documentDirectory, .userDomainMask, true
).first!
// this is how you create a DB with a table:-
do {
let db_name = "my_db"
let db = try Connection("\(path)" + "/" + db_name! + ".sqlite3")
try db.key("12345") // if db is encrypted with SQLCipher
do {
try db.run(mastertableName.create(ifNotExists: true) { t in
t.column(database_name)
t.column(email, unique: true)
t.column(date_created)
t.column(device_info)
})
}
catch {
print("Creating Master Table Failed!")
}
只要进行连接,它就会为你创建一个DB,如果它不存在!!
阅读数据库: -
do {
let db_name = "my_db"
let db = try Connection("\(path)" + "/" + db_name! + ".sqlite3")
try db.key("12345")
// db is now open... do your stuff..
}
catch {
print("opening the db failed!")
}