2015-10-26 3 views
0
-(void)insertQuery:(NSString *)query{ 
    sqlite3_stmt *selectstmt; 
    // Create a sqlite object. 
    sqlite3 *database; 
    // Set the database file path. 
    NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename]; 

    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
     //*************** insert value in database******************************\\ 

     const char *sql = [query UTF8String]; 
     sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL); 
     if(sqlite3_step(selectstmt)==SQLITE_DONE) 
     { 
      NSLog(@"insert successfully"); 
     } 
     else 
     { 
      NSLog(@"insert not successfully"); 
      NSLog(@"DB Error: %s", sqlite3_errmsg(database)); 
     } 
     sqlite3_finalize(selectstmt); 
    } 
    sqlite3_close(database); 
} 

Использование вышеприведенного кода, пытающегося запустить запрос на вставку, но когда-то это работает, и большую часть времени я получаю ошибку блокировки DB.Sqlite DB Locked

За помощь Спасибо заранее.

+0

Я не вижу SQL заявление. – trojanfoe

+0

Эта ошибка возникает, когда вы забыли очистить какой-либо оператор или соединение. Этот код выглядит нормально; ошибка в другом месте. –

+0

Это не совсем нормально. Открытие базы данных каждый раз, когда выполняется инструкция, очень дорого. Это также, вероятно, является основной причиной этой проблемы, поскольку OP не правильно управляет соединениями. – trojanfoe

ответ

0

Вы не закрываете соединение должным образом.

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
    //*************** insert value in database******************************\\ 

    const char *sql = [query UTF8String]; 
    sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL); 
    if(sqlite3_step(selectstmt)==SQLITE_DONE) 
    { 
     NSLog(@"insert successfully"); 
    } 
    else 
    { 
     NSLog(@"insert not successfully"); 
     NSLog(@"DB Error: %s", sqlite3_errmsg(database)); 
    } 
    sqlite3_finalize(selectstmt); 
    sqlite3_close(database); 
} 
+0

даже после выполнения той же вещи, что и в случае с тем же сценарием. – vje1998

0

Блокировка базы данных обычно происходит, когда вы пишете что-то в базе данных или вы оставили какое-то другое соединение открытым. Проверьте другой код, чтобы потерять соединения.

Попробуйте проверить SQLITE_OK на sqlite3_prepare_v2, поскольку база данных может быть занята и может возвращать SQLITE_BUSY для инструкции шага. Далее поясняется here. Попробуйте следующий код:

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
    //*************** insert value in database******************************\\ 

    const char *sql = [query UTF8String]; 
    if(sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL)==SQLITE_OK) 
    { 
     if(sqlite3_step(selectstmt)==SQLITE_DONE) 
     { 
      NSLog(@"insert successfully"); 
     } 
     else 
     { 
      NSLog(@"insert not successfully"); 
      NSLog(@"DB Error: %s", sqlite3_errmsg(database)); 
     } 
     sqlite3_finalize(selectstmt); 
    } 
    sqlite3_close(database); 
} 
4

Используйте эту ссылку и управлять базами данных с использованием этого FMDB. Я также столкнулся с этой проблемой 5 месяцев назад и использовал это, и моя проблема решена на 100%.

+0

thanx чувак работает нормально. – vje1998

+0

PLS принимает мой ответ, если проблема решена. @ Vje1998 – Prakash