我对编程很陌生,如果这是一个愚蠢的问题,我深表歉意。 我想在 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/