首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GRDB.swift 3请求,无需通过models[Finish]

使用GRDB.swift 3请求,无需通过models[Finish]
EN

Stack Overflow用户
提问于 2017-01-26 20:10:59
回答 1查看 1.1K关注 0票数 1

我无法在SQLite数据库上进行简单的选择,通过GRDB.swift这里是我的代码:

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

发布于 2017-01-27 08:16:34

GRDB文档他说

一旦授予数据库连接,execute方法将执行不返回任何数据库行的SQL语句,例如CREATE、INSERT、DELETE、ALTER等。

因此,如果您想要获取行,您选择了错误的方法。

要获取行,您可以使用一个取取方法(从fetch开始),如行查询文档一章所述,我鼓励您阅读该方法。

例如:

代码语言:javascript
复制
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)
}

这就是它给出的“不经过模特儿”。

然而,模型仍然很方便:

代码语言:javascript
复制
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)
}

如果您的游戏类型(struct或class)采用RowConvertible协议,您甚至可以编写:

代码语言:javascript
复制
let games = try dbQueue.inDatabase { db in
    try Game.fetchAll(db, "SELECT * FROM games")
}

如果游戏也采用TableMapping协议,您将得到:

代码语言:javascript
复制
let games = try dbQueue.inDatabase { try Game.fetchAll($0) }

有关这些协议的文档,请参见记录

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41882101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档