Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 无法访问fts4虚拟表-SQLite DB错误:1“没有这样的表:”_Swift_Sqlite_Xcode6_Fmdb - Fatal编程技术网

Swift 无法访问fts4虚拟表-SQLite DB错误:1“没有这样的表:”

Swift 无法访问fts4虚拟表-SQLite DB错误:1“没有这样的表:”,swift,sqlite,xcode6,fmdb,Swift,Sqlite,Xcode6,Fmdb,我对编程很陌生,如果这是一个愚蠢的问题,我很抱歉。 我想在iOS上制作一个字典应用程序,我想使用fts4表来实现这一点。我使用SQLite和FMDB。 所以,我创建了一个虚拟表,但当我试图在其中查找任何内容时,我得到一个异常,它不存在。发生了什么?在创建了一个虚拟表之后,我尝试在没有编写两个不同函数的情况下进行搜索,但仍然遇到了一个异常 代码如下: let db : FMDatabase let resourcePath = NSBundle.mainBundle().resourceURL!.

我对编程很陌生,如果这是一个愚蠢的问题,我很抱歉。 我想在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)
效果很好