GRDB.swift使用swift 3请求而不通过模型[完成]

时间:2017-01-26 20:11:00

标签: sqlite swift3 xcode8 grdb

我不能通过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

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