我对编程很陌生,如果这是一个愚蠢的问题,我很抱歉。
我想在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语句,应使用executeStations()函数。
因此,我将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 DB错误:1“没有这样的表:”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32065802/

10-12 05:12