首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从SQLite获取时,如何使GRDB忽略存储的变量?

当从SQLite获取时,如何使GRDB忽略存储的变量?
EN

Stack Overflow用户
提问于 2022-01-31 16:15:16
回答 2查看 212关注 0票数 0

我有一个同时采用TableRecordFetchableRecord的类。我正在利用GRDB提供的自动查询生成的优势,我只提供表名,因为它与类名不匹配。但是,现在我希望添加仅在运行时使用的存储属性,并且不希望GRDB尝试以自动方式获取这些属性。我可以从查询中排除某些变量吗?

这里是我的代码:

代码语言:javascript
复制
class Question: Identifiable, Codable, TableRecord, FetchableRecord {
    static var databaseTableName = "questions"
    
    var id: Int?
    var category: Int?
    var code: String?
    var ...
    var ...
    var ...
    var ...
    var selectedAnswer: Int? // This is only used at run-time and not present in the database.
}

我发现了这个:

代码语言:javascript
复制
static var databaseSelection = [Column("id"), Column("category"), Column("code"), ...]

但这要求我手动指定希望它获取的所有列。我可以做相反的事情,只排除一列(selectedAnswer)吗?

,基本上,我要找的是这样的东西:

代码语言:javascript
复制
static var excludedVariables = ["selectedAnswer"]

我读了一遍文档,找不到任何东西,但我不知道GRDB,所以我可能遗漏了一些东西。

EN

回答 2

Stack Overflow用户

发布于 2022-01-31 17:25:34

我认为这不是一个特定的GRDB问题,而是更多的Codable问题,即“如何排除一个属性被解码”。因此,您的解决方案可以是显式地定义编码键,而不是让Swift合成它们:

代码语言:javascript
复制
enum CodingKeys: String, CodingKey {
  case id, category, code, ...
}

它仍然要求您定义所有的列/属性,但是当您想要排除某些属性时,Codable总是这样。

票数 1
EN

Stack Overflow用户

发布于 2022-02-01 13:00:21

你不需要做任何事情:

默认情况下,

  • 选择所有列(SELECT * FROM ...)。如果没有用于非持久化属性的列,则不会获取它(生成的SQL中也不会插入无效的列)。
  • 可选属性从已解码行中不存在的列中解码为nil

例如:

代码语言:javascript
复制
import GRDB

var configuration = Configuration()
configuration.prepareDatabase { db in
    db.trace { print("SQL> \($0)") }
}
let dbQueue = DatabaseQueue(configuration: configuration)

struct Player: Identifiable, Codable, TableRecord, FetchableRecord {
    var id: Int64
    var name: String
    var score: Int
    var ignored: Int? // Has no matching column in the database
}

try dbQueue.write { db in
    try db.create(table: "player") { t in
        t.autoIncrementedPrimaryKey("id")
        t.column("name", .text).notNull()
        t.column("score", .integer).notNull()
    }

    try db.execute(sql: """
        INSERT INTO player (id, name, score) VALUES (NULL, 'Arthur', 100);
        INSERT INTO player (id, name, score) VALUES (NULL, 'Barbara', 1000);
        """)
    
    // SELECT * FROM player
    let players = try Player.fetchAll(db)

    // [Player(id: 1, name: "Arthur", score: 100, ignored: nil),
    //  Player(id: 2, name: "Barbara", score: 1000, ignored: nil)]
    print(players)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70929205

复制
相关文章

相似问题

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