如何在iOS中使用现有的SQLite数据库?

时间:2017-07-02 11:15:36

标签: ios swift sqlite.swift

我最近开始了一个iOS项目,需要使用一个独立的数据库,当有更新时,它将从互联网上下载。这是我的第一个iOS项目,所以我试图在设计下载机制之前使功能正常工作。

我选择了SQLite包装器SWLite.swifthttps://github.com/stephencelis/SQLite.swift)并准备好我的查询和表视图。但我无法连接到数据库。我在这里尝试了几乎所有其他问题/答案,但绝对没有成功。

例如,我将SQLite数据库放入Assets.xcassets并尝试let path = Bundle.main.path(forResource: "myDb", ofType: "db")!,然后应用程序崩溃(因为我得到nil - 大概是因为路径不能位于)。同样,我尝试了其他人建议的内容,包括在我的Mac上创建一个文件夹,将文件放入其中,将.bundle附加到文件夹名称,然后再将其放入资产... nil

有人可以提供建议吗?我看过Apple Docs并且找不到我想要的东西 - 再次,这是我的第一次,所以也许我做错了。

3 个答案:

答案 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)

1 .:获取数据库文件的有效路径

看起来您实际的主要问题是获取数据库文件的有效路径。如果数据库文件也位于Assets中,我也找不到任何使其工作的方法。因此,不要将数据库文件保存在Assets文件夹中,而是将其添加到当前目标的 Build Phases 设置中的 Copy Bundle Resources 列表中。 / strong>如果您的文件名为myDb.db,则可以获取如下有效路径:

let dbUrl = Bundle.main.url(forResource: "myDb", withExtension: "db")!
let dbPath = dbUrl.path

2 .:访问数据库(不复制数据库)

可以立即访问数据库而不必(手动?)复制数据库。只需使用已经提到的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!")
}