【问题标题】:Converting app from SQLite.swift to GRDB.swift Second Question将应用程序从 SQLite.swift 转换为 GRDB.swift 第二个问题
【发布时间】:2021-01-05 02:58:43
【问题描述】:

我正在继续将我的一些应用程序从 SQLite.sift 转换为 GRDB.swift。 我将我的结构转换为添加 Codable、FetchableRecord,以便让它们更好地与 GRDB 配合使用。这是在回复我关于此主题的第一篇文章时提出的。

struct FigureList: Codable, FetchableRecord
{
    let figID: Int64
    var notes: String?
    var theDescription: String
    var obrienNum: String
    var manufNum: String?
    var catagory: String?
}

这是我正在寻求帮助重做的一段代码,以便它可以与 GRDB 一起使用。我的应用程序使用这种类型的代码从数据库表构建数组。非常标准的流程。

static func getFigureList() -> [FigureList]
{
    var theArray = [FigureList]()
    let theTable = Table(gTheCollection)

    let figID = Expression<Int64>("FigureID")
    let notes = Expression<String>("Notes")
    let theDescription = Expression<String>("theDescription")
    let obrienNum = Expression<String>("ObrienNum")
    let manufNum = Expression<String>("ManufNum")
    let theCatagory = Expression<String>("Category")

    do {
        for figures in try Database.shared.databaseConnection!.prepare(theTable.order(obrienNum)) {

            theArray.append(FigureList(figID: figures[figID],
                                       notes: figures[notes],
                                       theDescription: figures[theDescription],
                                       obrienNum: figures[obrienNum],
                                       manufNum: figures[manufNum],
                                       catagory: figures[theCatagory]))
        }
    } catch {
        print("Fetching figure list failed: \(error)")
    }
    return theArray
}

这是我到目前为止所想出的。它不会产生任何警告或错误,但我很确定它并不完全正确。再次,提前感谢您的帮助。

static func getFigList() -> [FigureList]
{
    var theArray = [FigureList]()
    let theTable = gTheCollection
    
    let figID = Column("FigureID")
    let notes = Column("Notes")
    let theDescription = Column("theDescription")
    let obrienNum = Column("ObrienNum")
    let manufNum = Column("ManufNum")
    let theCatagory = Column("Category")
    
    do {
        try Database.shared.databaseConnection!.read { db in
            let figures = try Row.fetchOne(db, sql: "SELECT * FROM = ? ORDER BY ObrienNum", arguments: [theTable])
            
            theArray.append(FigureList.init(figID: figures![figID],
                                            notes: figures![notes],
                                            theDescription: figures![theDescription],
                                            obrienNum: figures![obrienNum],
                                            manufNum: figures![manufNum],
                                            catagory: figures![theCatagory]))
        }
    } catch {
        print("Fetching figure list failed: \(error)")
    }
    
    return theArray
}

【问题讨论】:

    标签: swift xcode sqlite.swift grdb


    【解决方案1】:

    我将我的结构转换为添加 Codable、FetchableRecord 以便让它们更好地与 GRDB 配合使用。

    很好。现在很简单:

    static func getFigList() throws -> [FigureList] {
        return try Database.shared.databaseConnection!.read { db in
            // SELECT * FROM FigureList ORDER BY ObrienNum
            return FigureList.order(Column("ObrienNum")).fetchAll(db)
        }
    }
    

    【讨论】:

    • 我知道不建议在 StackOverflow 答案中发送指向文档的链接。然而,很明显您没有充分检查 GRDB 文档。文档中详细介绍了像您这样的用例。把它放在你身边!
    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2014-04-25
    • 2011-08-27
    • 2020-11-18
    • 2018-08-16
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多