代码之家  ›  专栏  ›  技术社区  ›  gotnull mzelina

选择记录总数时,iPhone上的SQLite出现“未知错误”

  •  0
  • gotnull mzelina  · 技术社区  · 14 年前

    尝试返回iPhone上SQLite中是否存在记录,但我不断得到一个“未知错误”。

    选择stmt is static sqlite3_stmt *selectStmt = nil; 在这里使用 if(selectStmt) sqlite3_finalize(selectStmt); 只有在应用程序终止时才会执行。这个功能可以与delete语句和insert语句配合使用,所以我猜下面的逻辑有问题吗?

    - (BOOL) doesBookExist {
    
        if(selectStmt == nil) {
            const char *sql = "select count(*) from books where isbn = ?";
    
            if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating select statement. '%s'", sqlite3_errmsg(database));
        }
    
        //When binding parameters, index starts from 1 and not zero.
        int count = sqlite3_bind_text(selectStmt, 1, [isbn UTF8String], -1, SQLITE_TRANSIENT);
    
        if (SQLITE_DONE != sqlite3_step(selectStmt)) 
            NSAssert1(0, @"Error while selecting. '%s'", sqlite3_errmsg(database));
    
        sqlite3_reset(selectStmt);
    
        return (count > 0);
    }
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   Matthew Flaschen    14 年前

    sqlite3_bind_text 返回成功/错误代码,而不是任何查询的结果。这一步应该会回来 SQLITE_ROW ,因为您有一行结果数据(不管计数是0还是更多)。似乎有个错误,因为你在期待 SQLITE_DONE 当正确的值为 SQLITE\u行 sqlite3_column_int 执行步骤后。比如:

    int bind_res = sqlite3_bind_text(selectStmt, 1, [isbn UTF8String], -1, SQLITE_TRANSIENT);
    
    if (SQLITE_OK != bind_res)
    {
      // log error, return...
    }
    
    // One row of result data, so step should return SQLITE_ROW
    if (SQLITE_ROW != sqlite3_step(selectStmt)) 
    {
      NSAssert1(0, @"Error while selecting. '%s'", sqlite3_errmsg(database));
      // log error, return
    }
    
    int count = sqlite3_column_int(selectStmt, 0);