swift - 无法访问 fts4 虚拟表 - SQLite 数据库错误 : 1 "no such table:"

标签 swift sqlite xcode6 fmdb

我对编程很陌生,如果这是一个愚蠢的问题,我深表歉意。 我想在 iOS 上制作一个字典应用程序,我想为此使用 fts4 表。我使用 SQLite 和 FMDB。 所以,我创建了一个虚拟表,但是当我试图在其中查找任何内容时,我得到一个异常,它不存在。怎么了?我试图在创建虚拟表后立即进行搜索,而没有编写两个不同的函数,但仍然出现异常。

代码如下:

let db : FMDatabase
let resourcePath = NSBundle.mainBundle().resourceURL!.absoluteString
let dbPath = resourcePath?.stringByAppendingPathComponent("dictionary.db")


db = FMDatabase(path: dbPath)
var res : FMResultSet?


if (createVirtualDB(db, "vdict") != nil) {}
else { println("Error while opening db")}

res = findInVirtualDB("test", db, "vdict")

我用这段代码创建虚拟表:

func createVirtualDB (db : FMDatabase, name : String) -> Int?
{
    if db.open()
    {
        let querySQL = "CREATE VIRTUAL TABLE \(name) USING fts4(content=\"DICT2\", level, latin, russian)"
        db.executeQuery(querySQL, withArgumentsInArray: nil)
    }
    else {return nil}

    return 1
}

搜索功能如下所示:

func findInVirtualDB(searchedString: String, db : FMDatabase, name : String) -> FMResultSet?
{
    let res : FMResultSet?
    if db.open()
    {
        let querySQL = "SELECT level, latin, russian FROM \(name) WHERE latin MATCH '\(searchedString)'"
        res = db.executeQuery(querySQL, withArgumentsInArray: nil)
    }
    else {return nil}
    return res
} 

最佳答案

我发现了问题。问题是 executeQuery() 函数只适用于 SELECT 语句。对于 CREATE 语句,应该使用函数 executeStatements()。

所以我将 createVirtualDB() 函数的代码从:

let querySQL = "CREATE VIRTUAL TABLE \(name) USING fts4(content=\"DICT2\", level, latin, russian)"
db.executeQuery(querySQL, withArgumentsInArray: nil)

为此:

let querySQL = "CREATE VIRTUAL TABLE IF NOT EXISTS \(name) USING fts4(content=\"DICT2\", level, latin, russian)"
db.executeStatements(querySQL)

效果不错。

关于swift - 无法访问 fts4 虚拟表 - SQLite 数据库错误 : 1 "no such table:",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065802/

相关文章:

c# - 为什么使用 WAL 模式并启用池化来锁定 SQLite 数据库文件?

ios - UITableView 不显示单元格

ios - 当前位置的蓝点未使用适用于 iOS 的谷歌地图显示

ios - 确定 UIPinchGestureRecognizer 的方向(无斜率)

ios - swift 中字典声明的不同方式有哪些

ruby-on-rails - 销毁后从重新创建用户模型创建数据库时出错

ios - 准备失败: bad parameter or other API misuse in SQLite swift while inserting data

ios - uitableViewCell 不更新数据,因为它只显示空白

swift - 调用函数时无法更新我的 GMsmapView

ios - 如何使用 ios8 中的 SMS API 从我的 iOS 应用程序将用户重定向到默认 SMS 应用程序的收件箱