2013-04-12 6 views
1

Я не могу обновить одно поле. Предложите мне, что в коде не так.Невозможно обновить базу данных

Code: 

- (int) updateTaskDoneDate:(double)donedate ontaskid:(int)taskId 
{ 
    sqlite3 *database; 
    @try { 
     if (sqlite3_open([self.databasePath UTF8String], &database) == SQLITE_OK) 
     { 
      NSString *sql_str = [NSString stringWithFormat:@"update task set donedate='%f' where taskid=%d ", donedate ,taskId]; 
      NSLog(@"sql str: %@",sql_str); 
      const char *sql = [sql_str UTF8String]; 

      sqlite3_stmt *statement; 
      statement = [self PrepareStatement:sql]; 

      NSDate *myDate; 
      myDate=[NSDate date]; 

      int a1 = sqlite3_bind_double(statement, 1, [myDate timeIntervalSince1970]); 
      int a2 = sqlite3_bind_int(statement, 2, taskId); 
      NSLog(@"a1a2 %d, %d", a1, a2); 
      if (statement) 
      { 
       if (a1 != SQLITE_OK || a2 != SQLITE_OK) 
       { 
        sqlite3_finalize(statement); 
        return 0; 
       } 
       sqlite3_step(statement); 
      } 
      sqlite3_finalize(statement); 
     } 
    } 
    @catch (NSException *exception){ 
     [self showException:exception]; 
    } 
    @finally { 
     sqlite3_close(database); 
     return 1; 
    } 
} 
+0

Кроме того, я предполагаю, что ваш 'databasePath' находится в папке' Documents', а не в комплекте? Вы не можете обновлять базы данных, которые находятся в комплекте. – Rob

ответ

1

Несколько наблюдений:

  1. Вы используете sqlite3_bind_xxx (что хорошо, гораздо лучше, чем строить SQL с stringWithFormat), но у вас нет каких-либо ? заполнителей в вашем SQL. Ваш SQL предположительно должно быть:

    NSString *sql_str = @"update task set donedate=? where taskid=?"; 
    

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

  2. Вы не показываете отчет подготовки, но если он не работает, вы регистрируете sqlite3_errmsg?

  3. Аналогичным образом на ваших операторах связи, если они не являются SQLITE_OK, вы не регистрируете sqlite3_errmsg.

  4. Ваш sqlite3_step не проверяет его код возврата на всех, гораздо меньше протоколирование sqlite3_errmsg, если это не SQLITE_DONE.

Нижняя линия, вы должны связать с ? заполнителей и вы летите слепой, потому что вы не войти sqlite3_errmsg на неудачах.

+0

Обязательно ли добавить заявление о подготовке? – Abha

+0

@Aaaaa Если вы собираетесь связывать переменные, да, вы готовите, прежде чем будете связываться и шагать, и завершайте, когда закончите. Если вы не привязываете какие-либо переменные, вы можете сделать «sqlite3_exec», который инкапсулирует подготовку, одноэтапный вызов и завершение. Но, да, если вы собираетесь использовать заявление, которое вы собираетесь привязать, шаг и т. Д., Вы должны подготовиться. – Rob

+0

@Aaaaa Я предположил, что ваш 'PrepareStatement' выполняет вызов' sqlite3_prepare_v2' ... – Rob

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