为什么在插入 Int64 值时会出现 SQLite.swift 错误?

Why do I get SQLite.swift error when inserting Int64 values?

作为迁移工作的一部分,我第一次创建 SQLite 数据库。

基于站点中的示例文档

SQLite.swift documentation

我正在创建一个 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 的回复。