Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中将数据保存到sqlite3数据库_Ios_Swift_Sqlite_Pencilkit - Fatal编程技术网

Ios 在Swift中将数据保存到sqlite3数据库

Ios 在Swift中将数据保存到sqlite3数据库,ios,swift,sqlite,pencilkit,Ios,Swift,Sqlite,Pencilkit,我正在开发一个使用铅笔盒的应用程序。我试图将PK图形以数据的形式保存在sqlite3数据库中,但它没有保存。我假设问题在于save函数,而不是获取要显示的图形数据的函数,因为当我直接在终端中查询时,数据库中的图形行是空的 func save(canvas: Canvas) { // connect to database connect() // canvas.drawing is already in the form of data not PK drawi

我正在开发一个使用铅笔盒的应用程序。我试图将PK图形以数据的形式保存在sqlite3数据库中,但它没有保存。我假设问题在于save函数,而不是获取要显示的图形数据的函数,因为当我直接在终端中查询时,数据库中的图形行是空的

func save(canvas: Canvas) {
    // connect to database
    connect()
    
    // canvas.drawing is already in the form of data not PK drawing here
    let drawingData = canvas.drawing
    
    drawingData.withUnsafeBytes { drawingBuffer in
        
        let drawingPtr = drawingBuffer.baseAddress!

        var statement: OpaquePointer!
        
        if sqlite3_prepare_v2(database, "UPDATE drawings SET drawing = ? WHERE rowid = ?", -1, &statement, nil) != SQLITE_OK {
            print("Could not create (update) query")
        }
        
        sqlite3_bind_blob(statement, 1, drawingPtr, -1, nil)
        sqlite3_bind_int(statement, 2, Int32(canvas.id))
        
        if sqlite3_step(statement) != SQLITE_DONE {
            print("Could not execute update statement")
        }
        
        sqlite3_finalize(statement)

    }
}
一些意见:

  • 对于
    sqlite3\u bind\u blob
    ,第四个参数是大小,它是必需的,不能为负。使用
    sqlite3\u bind\u text
    ,您可以提供
    -1
    值,因为C字符串以null结尾,它可以计算字符串的结束位置,但不能用blob来完成

    正如上面所说:

    如果
    sqlite3\u bind\u blob()
    的第四个参数为负,则行为未定义

    因此,也许:

    guard let blob = drawingBuffer.baseAddress else { return }
    let count = Int32(drawingBuffer.count)
    
    然后:

    sqlite3_bind_blob(statement, 1, blob, count, nil)
    
  • 此外,如果SQLite调用失败,您应该打印错误,否则您将盲目地执行,例如

    let errorMessage = sqlite3_errmsg(database).map { String(cString: $0) } ?? "Unknown error"
    print("failure preparing UPDATE statement: \(errorMessage)")
    
    无论何时检查SQLite返回代码,都应该这样做。这通常会使诊断呼叫失败的原因变得更容易


  • 或者干脆
    sqlite3\u errmsg(数据库).map(String.init)
    谢谢Rob!数据库现在不是空的!