我不能通过GRDB.swift对SQLite数据库进行简单的选择 这是我的代码:
override func viewDidLoad()
{
super.viewDidLoad()
do
{
let dbQueue = try DatabaseQueue(path: "games.sqlite")
try dbQueue.inDatabase
{
db in try db.execute("SELECT * FROM games")
}
}
catch
{
print("Erreur !")
}
}
我在文档中没有找到一个简单的方法来执行一个简单的选择,文档说的是模型,我希望暂时可以进行直接查询。 该文档仅代表模型中的错误。
谢谢大家的帮助。
我的环境: Xcode8.2.1 swift3 cocoapods 1.2.0.rc.1
答案 0 :(得分:1)
GRDB文档says:
一旦授予数据库连接,
execute
方法就会执行不返回任何数据库行的SQL语句,例如CREATE TABLE,INSERT,DELETE,ALTER等。
因此,如果要获取行,则选择了错误的方法。
要获取行,请使用提取方法(以fetch
开头),如Row Queries文档章节中所述,我建议您阅读。
例如:
let rows = try dbQueue.inDatabase { db in
try Row.fetchAll(db, "SELECT * FROM games")
}
// Now we're back to the main thread: use rows:
for row in rows {
let name: String = row.value(named: "name")
let year: Int = row.value(named: "year")
print(name)
print(year)
}
这就是“不经过模特”所给出的。
然而模特仍然很方便:
let games = try dbQueue.inDatabase { db -> [Game] in
let rows = try Row.fetchAll(db, "SELECT * FROM games")
return rows.map { row in
Game(
name: row.value(named: "name"),
year: row.value(named: "year"))
}
}
// Now we're back to the main thread: use games
for game in games {
print(game.name)
print(game.year)
}
如果您的游戏类型(结构或类)采用RowConvertible协议,您甚至可以写:
let games = try dbQueue.inDatabase { db in
try Game.fetchAll(db, "SELECT * FROM games")
}
如果Game也采用了TableMapping协议,你会得到:
let games = try dbQueue.inDatabase { try Game.fetchAll($0) }
有关这些协议的文档,请参阅Record。