Почему я получаю sqlite3error? - PullRequest
0 голосов
/ 28 апреля 2009

Я пытаюсь повторно использовать выражение sqlite в моем приложении в методе. Вот соответствующий код

if(getsets_statement == nil){
    const char *sql = "SELECT DISTINCT num,roll FROM mytable WHERE cls like ? and divname like ?";
    if(sqlite3_prepare_v2(database, sql, -1, &getsets_statement, NULL) != SQLITE_OK){
        NSAssert1(0, @"Error: Failed to prepare stmt with message '%s'", sqlite3_errmsg(database));
    }       
}

sqlite3_bind_text(getsets_statement, 1, [cls UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(getsets_statement, 2, [divname UTF8String], -1, SQLITE_TRANSIENT);

while(sqlite3_step(getsets_statement) == SQLITE_ROW){

    setNumber= sqlite3_column_int(getsets_statement, 0);        

    roll = sqlite3_column_int(getsets_statement, 1);

    [numArr addObject:[NSNumber numberWithInt:setNumber]];
    [rollArr addObject:[NSNumber numberWithInt:roll]];
}

sqlite3_reset(getsets_statement);

Оператор отлично выполняется при первом вызове. Но в следующий раз, когда я вызову этот метод, я получу sqlite3error. Существуют значения divname и cls (сделал NSLog и проверил), но я не понимаю, почему я получаю эту ошибку. Я получаю сообщение об ошибке при первом bind_text утверждении.

Это в консоли GDB

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) where
#0  0x9041857f in sqlite3Error ()
#1  0x9041acea in vdbeUnbind ()
#2  0x9041b2c8 in bindText ()

Любая помощь?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2009

Убедитесь, что больше ничего не является проблемой (база данных закрыта где-то еще? getsets_statement указывает на тот же объект? Был ли он завершен?). Затем попробуйте использовать NULL или SQLITE___STATIC вместо SQLITE_TRANSIENT. Поскольку [NSString UTF8String] возвращает данные, которые не нужно освобождать (вами), ему, очевидно, не нужен деструктор, и он останется действительным до тех пор, пока ваша функция не выйдет, и тогда вы все равно выполните оператор .

0 голосов
/ 28 апреля 2009

Полагаю, вам нужно вызвать sqlite3_reset и sqlite3_clear_bindings для подготовленного оператора, прежде чем пытаться использовать его повторно. Кроме того, вы действительно должны проверить свои коды возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...