Nei*_*ord 5 ios swift sqlite.swift
我尝试使用 SQLite.swift 的Codable功能插入一行,但收到以下错误消息:
Swift.EncodingError.Context(codingPath: [], debugDescription: "Top-level
MyEnum encoded as number JSON fragment.", underlyingError: nil))
Run Code Online (Sandbox Code Playgroud)
我的枚举扩展Int并且Codable:
enum MyEnum : Int, Codable {
case FIRSTVAL = 0, SECONDVAL = 1
}
Run Code Online (Sandbox Code Playgroud)
消耗它的类如下所示:
class MyClass : Codable {
static let tableRef = Table("MyTable")
static let idColumn = Expression<Int>("MyTableId");
static let nameColumn = Expression<String>("Name")
static let myEnumValColumn = Expression<Int>("MyEnumVal")
static func createTable(_ db : Connection) throws {
try db.run(tableRef.create(ifNotExists: true) { t in
t.column(idColumn, primaryKey: true)
t.column(nameColumn)
t.column(myEnumValColumn)
})
}
var MyTableId : Int!
var Name : String
var MyEnumVal : MyEnum
}
Run Code Online (Sandbox Code Playgroud)
尝试插入行并导致引发错误的代码:
try db.run(MyClass.tableRef.insert(anInstanceOfMyClass))
Run Code Online (Sandbox Code Playgroud)
我知道在 SQLite.swift 的文档中它说:
可编码和可解码对象只能使用以下类型:
- 整型、布尔型、浮点型、双精度型、字符串型
- 将被编码为 JSON 到单个列的嵌套 Codable 类型
有没有办法强制它使用rawValue枚举的(因为它无论如何都会扩展),也许可以通过手动实现or 的Int编码/解码方法?我试图避免手动编写代码来将数据库中的行反序列化回对象,并从准备好数据库的对象进行序列化。例如,我以前有以下方法(以及其他从数据库加载实体并必须反序列化它们的代码):MyEnumMyClassMyClass
init(row : Row) {
self.MyTableId = row[MyClass.idColumn]
self.Name = row[MyClass.nameColumn]
self.MyEnumVal = MyEnum(rawValue: Int(row[MyClass.myEnumValColumn]))!
}
func insert(_ db : Connection) throws {
let insert = MyClass.tableRef.insert(
MyClass.idColumn <- Int(MyTableId),
MyClass.nameColumn <- Name,
MyClass.myEnumValColumn <- Int(MyEnumVal.rawValue)
)
try db.run(insert)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1670 次 |
| 最近记录: |