为什么在插入 Int64 值时会出现 SQLite.swift 错误?
Why do I get SQLite.swift error when inserting Int64 values?
作为迁移工作的一部分,我第一次创建 SQLite 数据库。
基于站点中的示例文档
我正在创建一个 Insert 语句,然后 运行 它来插入记录。
我在具有 Int64 值的每一行上都收到以下错误:
Cannot convert value of type 'Expression<Int64>' to expected argument
type 'Expression<Int?>'
我的代码中没有可选值,它在这些行中被引入。
我不明白为什么,或者我应该怎么做才能让编译器满意。
import SQLite
extension Connection {
/// Source could be a json file or a migration from Realm, for example
static func insertAprilRecords(records: [AprilRecord]) {
/// List target db's fields
let id = Expression<Int64>(AprilRecord.Key.id.rawValue)
let activity = Expression<Int64>(AprilRecord.Key.activity.rawValue)
let timestamp = Expression<Double>(AprilRecord.Key.timestamp.rawValue)
let details = Expression<String>(AprilRecord.Key.details.rawValue)
let isCompleted = Expression<Bool>(AprilRecord.Key.isCompleted.rawValue)
let table = Table("record") // equivalent of `Goal`
do {
let db = try Connection(DBSetup.dbURL.path)
try db.transaction {
for record in records {
let insertionRecord = table.insert(
// error: Cannot convert value of type 'Expression<Int64>' to expected argument
activity <- record.activity,
timestamp <- record.timestamp,
details <- record.details,
isCompleted <- record.isCompleted,
)
let rowid = try db.run(insertionRecord)
}
}
} catch {
print("failed to add records to the DB")
print(error)
print(error.localizedDescription)
}
}
}
我没有任何可选字段:
public struct AprilRecord: Identifiable, Codable {
public var id: Int
var activity: Int
var timestamp: Double
var details: String
var isCompleted: Bool
}
为了完整性(所以它会编译),这是我的密钥:
extension AprilRecord {
enum Key: String, CaseIterable {
case id, activity, timestamp, details, isCompleted
}
}
因为我在网上找不到任何关于这个问题的例子,我想我做的事情根本上是错误的。
插入非可选 Int64 值的正确方法是什么?
编辑:
如果我修改表达式定义以使用可选的:
let category = Expression<Int64?>(AprilRecord.Key.category.rawValue)
我收到一条错误消息,我不希望出现以下行:
category <- record.category,
Binary operator '<-' cannot be applied to operands of type
'Expression<Int64?>' and 'Int'
此时左侧不应该是 Expression 吗?
当然不是 Int.
好吧,我做错了根本性的事情。
尽管文档显示大量使用 Expression,但我应该使用 Expression。如:
let activity = Expression<Int>(AprilRecord.Key.activity.rawValue)
来自文档(与上面相同 link):
*While Int64 is the basic, raw type (to preserve 64-bit integers on 32-bit platforms), Int and Bool work transparently.
它确实透明地工作!
感谢 Joakim 和 Ptit 的回复。
作为迁移工作的一部分,我第一次创建 SQLite 数据库。
基于站点中的示例文档
我正在创建一个 Insert 语句,然后 运行 它来插入记录。
我在具有 Int64 值的每一行上都收到以下错误:
Cannot convert value of type 'Expression<Int64>' to expected argument type 'Expression<Int?>'
我的代码中没有可选值,它在这些行中被引入。
我不明白为什么,或者我应该怎么做才能让编译器满意。
import SQLite
extension Connection {
/// Source could be a json file or a migration from Realm, for example
static func insertAprilRecords(records: [AprilRecord]) {
/// List target db's fields
let id = Expression<Int64>(AprilRecord.Key.id.rawValue)
let activity = Expression<Int64>(AprilRecord.Key.activity.rawValue)
let timestamp = Expression<Double>(AprilRecord.Key.timestamp.rawValue)
let details = Expression<String>(AprilRecord.Key.details.rawValue)
let isCompleted = Expression<Bool>(AprilRecord.Key.isCompleted.rawValue)
let table = Table("record") // equivalent of `Goal`
do {
let db = try Connection(DBSetup.dbURL.path)
try db.transaction {
for record in records {
let insertionRecord = table.insert(
// error: Cannot convert value of type 'Expression<Int64>' to expected argument
activity <- record.activity,
timestamp <- record.timestamp,
details <- record.details,
isCompleted <- record.isCompleted,
)
let rowid = try db.run(insertionRecord)
}
}
} catch {
print("failed to add records to the DB")
print(error)
print(error.localizedDescription)
}
}
}
我没有任何可选字段:
public struct AprilRecord: Identifiable, Codable {
public var id: Int
var activity: Int
var timestamp: Double
var details: String
var isCompleted: Bool
}
为了完整性(所以它会编译),这是我的密钥:
extension AprilRecord {
enum Key: String, CaseIterable {
case id, activity, timestamp, details, isCompleted
}
}
因为我在网上找不到任何关于这个问题的例子,我想我做的事情根本上是错误的。
插入非可选 Int64 值的正确方法是什么?
编辑:
如果我修改表达式定义以使用可选的:
let category = Expression<Int64?>(AprilRecord.Key.category.rawValue)
我收到一条错误消息,我不希望出现以下行:
category <- record.category,
Binary operator '<-' cannot be applied to operands of type 'Expression<Int64?>' and 'Int'
此时左侧不应该是 Expression
好吧,我做错了根本性的事情。
尽管文档显示大量使用 Expression
let activity = Expression<Int>(AprilRecord.Key.activity.rawValue)
来自文档(与上面相同 link):
*While Int64 is the basic, raw type (to preserve 64-bit integers on 32-bit platforms), Int and Bool work transparently.
它确实透明地工作!
感谢 Joakim 和 Ptit 的回复。