我正试图从表获取具有相同 USERID 的所有行 我认为 sqlite3_prepare_v2 或 sqlite3_bind_text 有问题, 为了调试这个代码,我打印了
print(sqlite3_step(sqlite3_stmt))
print(sqlite3_step(sqlite3_stmt))
第一次打印为 101 ,第二次打印 21
然而“SELECT * from IMAGE_TABLE”运作良好
谢谢!
var sqlite3_stmt: OpaquePointer? = nil
if (sqlite3_prepare_v2(database,"SELECT * from IMAGE_TABLE where USERID = ?;",-1,&sqlite3_stmt,nil) == SQLITE_OK){
sqlite3_bind_text(sqlite3_stmt, 1, uid.cString(using: .utf8), 1,nil);
while(sqlite3_step(sqlite3_stmt) == SQLITE_ROW){
let imageDescription = String(validatingUTF8:sqlite3_column_text(sqlite3_stmt,0))
let imageUrl = String(validatingUTF8:sqlite3_column_text(sqlite3_stmt,2))
let imageName = String(validatingUTF8:sqlite3_column_text(sqlite3_stmt,3))
let pic = Picture(imageDescription!,imageUrl!,imageName!)
picList.append(pic)
}
答案 0 :(得分:2)
101
为SQLITE_DONE
,表示没有更多行要返回,即没有与WHERE
子句匹配的记录。 21
是SQLITE_MISUSE
,因为您刚刚告诉您没有更多记录后,您调用sqlite3_step
来检索下一条记录。
这里有两个问题:
您的?
占位符与sqlite3_bind_text
绑定,但您使用1
作为第四个参数。这意味着它只会使用uid
字符串的第一个字符。我怀疑你打算使用-1
,这是一个负值,它指示sqlite3_bind_text
使用整个字符串直到零终止符。
您还应在SQLITE_TRANSIENT
来电中使用sqlite3_bind_text
。因此,如果您还没有,请定义这些常量:
internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
然后在sqlite3_bind_text
电话中使用它:
guard sqlite3_bind_text(statement, 1, uid.cString(using: .utf8), -1, SQLITE_TRANSIENT) == SQLITE_OK else {
...
}
这指示SQLite自己制作该C字符串的副本,因为您无法保证自己的C字符串的生命周期。
答案 1 :(得分:0)
谢谢你现在使用SQLITE_TRANSIENT
工作得很好