2012-04-25 5 views
2

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

NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"appforoffice.sqlite"]; 
    BOOL success = [fileMgr fileExistsAtPath:dbPath]; 
    if(!success) 
    { 
     NSLog(@"Cannot locate database file '%@'.", dbPath); 
    } 
    if(!(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)) 
    { 
     NSLog(@"An error has occured."); 
    } 

    const char *sql = "UPDATE settings SET `value`='Off' WHERE `type`=?"; 
if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) == SQLITE_OK) 
    { 
     if(sqlite3_bind_text(updateStmt, 1, [updateType UTF8String], -1, SQLITE_TRANSIENT) == SQLITE_OK) 
     { 
      if(sqlite3_step(updateStmt) == SQLITE_DONE) { 
       NSLog(@"Update Done successfuly"); 
      } 
      else { 
       NSLog(@"Error while updating. '%s'", sqlite3_errmsg(database)); 
      } 

      sqlite3_finalize(updateStmt); 
      sqlite3_close(database); 
     } 
     else 
     { 
      NSLog(@"Error while binding variable. '%s'", sqlite3_errmsg(database)); 
     } 
    } 
    else 
    { 
     NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database)); 
    } 

Но ребята, я не получаю ошибку. Но проблема в том, что таблица базы данных не выполняется по запросу. Я уверен, что запрос в порядке.

Я смущен о проблеме, не могу найти способ выйти из этого.

+0

@Anki Спасибо ... –

+1

Вам нужно будет опубликовать запрос и, возможно, схему, если вы хотите решить проблему с этим типом базы данных. – trojanfoe

+0

@SoumalyaBanerjee Не могли бы вы проверить проблему, упомянутую здесь http://stackoverflow.com/questions/39916124/sqlite3-prepare-v2-exc-bad-access-in-ios-10. Я также столкнулся с аналогичной проблемой после обновления до iOS-10. – CoDe

ответ

4

sqlite3_prepare_v2() не возвращает логическое значение, поэтому проверка его возвращаемого значения с ! неверна. От reference:

При успешном выполнении семейство подпрограмм sqlite3_prepare() возвращает SQLITE_OK; в противном случае возвращается код ошибки.

Так что ваш код должен выглядеть следующим образом:

if (sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) == SQLITE_OK) 
{ 
    if (sqlite3_bind_text(updateStmt, 1, [updateType UTF8String], -1, 
     SQLITE_TRANSIENT) == SQLITE_OK) 
    { 
     ... call update API ... 
    } 
    else 
    { 
     NSLog(@"Error while binding variable. '%s'", sqlite3_errmsg(database)); 
    } 
} 
else 
{ 
    NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database)); 
} 

EDIT (после того, как вопрос был обновлен весь запрос):

мне не нравится внешний вид `символов в запросе; удалите их и это должно работы.

+0

Я сделал именно то, что вы мне сказали. Теперь я не получаю ошибку ** Ошибка при связывании переменной. 'индекс привязки или столбца вне диапазона **. –

+1

OK, индексы столбцов привязки начинаются с 0; измените '1' в инструкции на' 0'. – trojanfoe

+0

Я решил ошибку, в моей просьбе была глупая ошибка. Теперь я не получаю никаких ошибок. Но основная проблема заключается в том, что запрос обновления не выполняется, т. Е. Таблица данных не выполняется. Но вопрос в порядке. –

1

Я предпочитаю использовать команду SQL прямо вперед без каких-либо подготовки или связать методы

sqlite3_exec(database,[sql UTF8String],nil,nil,nil); 

где SQL является NSString, который имеет оператор обновления, просто убедитесь, что ваш дб открыт

надежда, что помогает

+0

Когда я использую 'sqlite3_exec', я не получаю никаких ошибок, это не имеет никакого эффекта, т. Е. Запрос на обновление не запущен.Но вопрос в порядке. –

+0

Я использую его всегда, и он работает, убедитесь, что вы открыли базу данных «if (sqlite3_open ([_ dbPath UTF8String] и база данных) == SQLITE_OK) ' –

Смежные вопросы