2012-05-04 2 views
0

У меня проблема в моем приложении Iphone. Некоторое время мое приложение успешно запускается, но в некоторых случаях оно дает «databse заблокированное исключение», поэтому я не могу читать или вставлять данные из базы данных sqlite. Пожалуйста, предложите мне, если у кого-нибудь есть какое-то решение. Это мой код вставки данных в databse Спасибо.Sqlite Заблокирована база данных при вставке данных

-(void)insertDataIntoDatabase 
{ 
    NSLog(@"insertDataIntoDatabase-----1"); 

    @try{ 
     tUserName=userNameTf.text; 
     tLevel=[NSString stringWithFormat:@"%d",level]; 
     tMoves=[NSString stringWithFormat:@"%d",moves]; 

     NSLog(@"tLevel;;;%@",tLevel); 
     // NSString *tdatabaseName = @"FlipScoreBord.sqlite"; 
     sqlite3_stmt *addStatement; 
     // NSArray *tdocumentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     // NSString *tdocumentsDir = [tdocumentPaths objectAtIndex:0]; 
     // NSString *tdatabasePath = [tdocumentsDir stringByAppendingPathComponent:tdatabaseName]; 
     NSString *insertQuery = [NSString stringWithFormat:@"INSERT INTO Moves (User_Name,User_Label,User_Moves) VALUES('%@','%@','%@')",tUserName,tLevel,tMoves]; 
     const char *sql = [insertQuery cStringUsingEncoding:NSUTF8StringEncoding]; 

     if(sqlite3_prepare_v2(tdatabase, sql, -1, &addStatement, NULL) != SQLITE_OK) 
     { 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(tdatabase)); 
     } 
     sqlite3_bind_text(addStatement, 0, [tUserName UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStatement, 1, [tLevel UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStatement, 2, [tUserName UTF8String], -1, SQLITE_TRANSIENT); 

     if(SQLITE_DONE != sqlite3_step(addStatement)) 
     { 
      NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(tdatabase)); 
      sqlite3_reset(addStatement); 
     } 
     sqlite3_close(tdatabase); 
    } 

    @catch (NSException *r) 
    { 
     NSLog(@"Exception---- %@",r); 
    } 
    NSLog(@"insertDataIntoDatabase-----2"); 

} 
+0

Это многопоточное приложение? Это может вызвать проблемы с блокировкой. – Rob

+0

Нет. Это не многопрофильное приложение. – Suraj

ответ

1

Я должен признаться, что я использую FMDB (в SQLite оболочку, которая изолирует меня от SQLite функций), но пара вещей выглядит странно:

  1. Если вы sqlite3_prepare_v2() заявление , вам не нужен ваш sqlite3_finalize()?

  2. Похоже, вы закрываете дБ здесь, но не открываете его. Похоже на то, что ваши заявления sqlite3_open() и ваши вызовы sqlite3_close() не сбалансированы. Вы на 100% уверены, что это не проблема? Я постараюсь включить NSLog в открытые и закрытые заявления и убедиться, что они сбалансированы.

Сочетание этих двух вопросов, заставляют меня задаться вопросом, если вы имели в виду sqlite3_finalize(), где Вы в настоящее время sqlite3_close().

Всего несколько идей.

1

Эта ссылка перечисляет причины, как может быть вызвана ошибка блокировки базы данных:

http://www.sqlite.org/cvstrac/wiki?p=DatabaseIsLocked

Цитирование одной из причин:

Попытка записи в таблице время SELECT активен в той же таблице.

Поскольку вы не вызывали sqlite3_finalize в своем заявлении, возможно, что предыдущий оператор «SELECT» блокирует ваш «INSERT». Попробуйте добавить sqlite3_finalize, прежде чем вы вызовите sqlite3_close.

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