0

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

selectStmtstatic sqlite3_stmt *selectStmt = nil;在这里使用if(selectStmt) sqlite3_finalize(selectStmt);,只有在应用程序终止时才会执行。此功能适用于删除语句和插入语句,所以我猜下面的逻辑有问题?

- (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);
}
4

1 回答 1

2

sqlite3_bind_text返回成功/错误代码,而不是任何查询的结果。并且 step 应该返回SQLITE_ROW,因为您有一行结果数据(无论计数是 0 还是更多)。似乎有一个错误,因为您期望SQLITE_DONE正确的值是SQLITE_ROW. 然后,要获得计数,您需要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); 
于 2010-07-05T12:20:54.873 回答