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