SQLite“where”返回21

时间:2017-02-11 15:56:59

标签: swift sqlite

我正试图从获取具有相同 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)
        }

2 个答案:

答案 0 :(得分:2)

101SQLITE_DONE,表示没有更多行要返回,即没有与WHERE子句匹配的记录。 21SQLITE_MISUSE,因为您刚刚告诉您没有更多记录后,您调用sqlite3_step来检索下一条记录。

这里有两个问题:

  1. 您的?占位符与sqlite3_bind_text绑定,但您使用1作为第四个参数。这意味着它只会使用uid字符串的第一个字符。我怀疑你打算使用-1,这是一个负值,它指示sqlite3_bind_text使用整个字符串直到零终止符。

  2. 您还应在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

工作得很好