2015-06-08 5 views
-1

Я пытаюсь обновить строку в цикле и не работать. Я объяснил сценарий нижеОбновление не работает sqlite в объекте c

У меня есть набор значений из веб-сервисов, хранящихся в массивах. Теперь я должен обновить эти значения в БД, перейдя через массив. Ниже код я использую:

NSString *dbPath = [[NSBundle mainBundle] pathForResource:@"db_name" ofType:@"sqlite"]; 

sqlite3 *database; 

sqlite3 *database1; 

sqlite3_open([dbPath UTF8String], &database1); 

sqlite3_open([dbPath UTF8String], &database);  

NSInteger loopCnt = 0; 

NSString *s = [[NSString alloc] init]; 

const char *sql; 

sqlite3_stmt *selectstmt; 

NSString *q = [[NSString alloc] init]; 

for(NSString *itemId in itemIds) 
{ 

    s = [NSString stringWithFormat:@"SELECT * from table where id=%@", itemId]; 

    sql = [s UTF8String]; 

    int result = sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL); 

    if(result == SQLITE_OK) 
    { 
     while(sqlite3_step(selectstmt) == SQLITE_ROW) 
     { 
      if ((char *)sqlite3_column_text(selectstmt, 0) != NULL) 
      { 
       rowNumVal = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)]; 

       col1 = [values1 objectAtIndex:loopCnt]; 

       col2 = [values2 objectAtIndex:loopCnt]; 

       if([rowNumVal integerValue] > 0) 
       { 
        q = [NSString stringWithFormat:@"UPDATE table set col1=?, col2=? WHERE id=?"]; 
       } 
      } 
     } 
    }   
    sqlite3_finalize(selectstmt);   

    sqlite3_exec(database1, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0); 

    sqlite3_stmt *stmt; 

    const char *query = [q UTF8String]; 

    if(sqlite3_prepare_v2(database1, query, -1, &stmt, NULL)== SQLITE_OK) 
    { 

     if(sqlite3_bind_text(stmt, 1, [col1 UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) 
     { 
      NSLog(@"Error while binding column 1 %s", sqlite3_errmsg(database1)); 
     } 

     if(sqlite3_bind_text(stmt, 2, [col2 UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) 
     { 
      NSLog(@"Error while binding column 2 %s", sqlite3_errmsg(database1)); 
     } 

     if (sqlite3_step(stmt) != SQLITE_DONE){ 
      NSLog(@"Delete commit failed. Error %s", sqlite3_errmsg(database1)); 
     } 
     if(sqlite3_reset(stmt)!= SQLITE_OK){ 
      NSLog(@"SQL error %s", sqlite3_errmsg(database1)); 
     }    
    }   

    sqlite3_trace(database1, sqliteCallbackFunc, NULL); 

    sqlite3_finalize(stmt); 

    if(sqlite3_exec(database1, "COMMIT TRANSACTION", 0, 0, 0) != SQLITE_OK){ 
     NSLog(@"SQL error %s", sqlite3_errmsg(database1)); 
    } 

    loopCnt++; 
} 

sqlite3_close(database); 

sqlite3_close(database1); 

Я выборку значения с помощью идентификатора для проверки строки существует и если существует обновление утра. Все регистрируется и работает нормально, но все же БД не обновляется.

Пожалуйста, дайте мне знать, где проблема.

ответ

0

Вам нужно позвонить:

sqlite3_finalize(stmt); 

До:

if(sqlite3_reset(stmt)!= SQLITE_OK) 
{ 
    NSLog(@"SQL error %s", sqlite3_errmsg(database1)); 
} 

В текущем коде, вы переустановить подготовленное заявление SQLite в его первоначальное состояние, прежде чем завершить его.

Еще одна проблема заключается в том, что вы пытаетесь обновить базу данных, расположенную в App Bundle. Это не сработает, потому что пакет приложений доступен только для чтения. Вам необходимо скопировать базу данных в каталог документов и выполнить операции с этой скопированной базой данных.

+0

привет спасибо за ваш ответ. Если я закончил работу над перезагрузкой приложений. Если я закомментирую элемент сброса и поставлю финализацию там, то никаких ошибок, но все равно его не обновлять в БД. – itdeeps

+0

@itdeeps: Пожалуйста, уточните обновленный ответ –

+0

Спасибо человеку. Наконец это сработало. Я ссылался на многие сайты, но никто не упомянул об этом. – itdeeps

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