«неизвестная ошибка» в SQLite на iPhone при выборе общего количества записей

Попытка вернуть, существует ли запись в SQLite на iPhone, за исключением того, что я продолжаю получать «неизвестную ошибку».

selectStmt static 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);
}

person fulvio    schedule 05.07.2010    source источник


Ответы (1)


sqlite3_bind_text возвращает код успеха/ошибки, а не результат какого-либо запроса. И шаг должен возвращать 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); 
person Matthew Flaschen    schedule 05.07.2010
comment
Это имеет смысл, и это работает именно так, как я хотел, чтобы это работало. Спасибо. - person fulvio; 06.07.2010
comment
@Sridhar, en.wikipedia.org/wiki/ISBN . Но это также и имя столбца, и переменная в этом коде. - person Matthew Flaschen; 20.03.2014