代码之家  ›  专栏  ›  技术社区  ›  Dharma

Swift SQLite数据库如何插入日期字段

  •  1
  • Dharma  · 技术社区  · 6 年前

    我已经创建了Sqlite表,正在尝试插入数据。插入日期字段时,编译器给出错误:

    无法转换“Date”类型的值应为参数类型“UnsafePointer!”

    这是我的代码:

    func insert() {
        let db = openDatabase()
        var insertStatement: OpaquePointer? = nil
    
        if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {
            let trNumber: String = scanOutput
            let empId: String = "TBD"
            let carrier = "TBD_CARRIER"
            let recLoc: String? = "TBD_LOCATION"
            let recDate: Date? = scannedDate
            let recdBy: String = "TBD_BUY"
            let dlyStatus: String? = "R"
    
            sqlite3_bind_text(insertStatement, 1, trNumber, nil)
            sqlite3_bind_text(insertStatement, 2, empId, -1, nil)
            sqlite3_bind_text(insertStatement, 3, carrier, -1, nil)
            sqlite3_bind_text(insertStatement, 4, recLoc, -1, nil)
            sqlite3_bind_text(insertStatement, 5, recDate, -1, nil) // This line gives error
            sqlite3_bind_text(insertStatement, 6, recdBy, -1, nil)
            sqlite3_bind_text(insertStatement, 7, dlyStatus, -1, nil)
    
    // the code continues, but I have just reproduced the line where I get error 
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   rmaddy    6 年前

    你在试图 sqlite3_bind_text 用一个 Date 但这是字符串。

    我建议你保存 日期 具体如下:

    if let recDate = recDate {
        sqlite3_bind_double(insertStatement, someColumnIndex, recDate.timeIntervalSinceReferenceDate)
    } else {
        sqlite3_bind_null(insertStatement, someColumnIndex)
    }
    

    然后,您可以通过以下方式重新阅读:

    if sqlite3_column_type(queryStatement, someColumnIndex) != SQLITE_NULL {
        date = Date(timeIntervalSinceReferenceDate: sqlite3_column_double(queryStatement, someColumnIndex))
    }
    
        2
  •  1
  •   Nick08    4 年前

    在insert语句中使用sqlite函数datetime()

    let insertStatementString = "INSERT INTO Records (trNumber, empId, carrier, recLoc, recDate, recdBy, dlyStatus) VALUES (?,?,?,?,datetime(?),?,?)"
    

    然后将日期转换为字符串并将其绑定为文本

    // Setup date (yyyy-MM-dd HH:mm:ss)
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let dateString = formatter.string(from: recDate)
    
    // Bind values to insert statement
    sqlite3_bind_text(insertStatement, 4, (dateString as NSString).utf8String, -1, nil)
    

    有关参考,请参见 https://www.techonthenet.com/sqlite/functions/datetime.php