我正在使用以下方法將數據添加到sqlite表。 使用此方法首先記錄獲取插入,然後添加第二個記錄我得到「數據庫被鎖定」。 任何幫助將不勝感激。如何處理Sqlite數據庫被鎖定在iOS?
-(BOOL)insertData:(float)old_otp old_generated_at:(NSString*)old_generated_at old_msp_delivery_time:(NSString*)old_msp_delivery_time old_valid_upto:(NSString*)old_valid_upto rc_profile_master_pm_id:(double)rc_profile_master_pm_id otp_validity:(BOOL)otp_validity
{
@try
{
NSString *documentsFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *documentsPath = [[documentsFolder stringByAppendingPathComponent:@"RCDB"] stringByAppendingPathExtension:@"sqlite"];
BOOL success = [DBManager initDatabase];
if(!success)
{
NSLog(@"Cannot locate database file '%@'.", documentsPath);
}
if(!(sqlite3_open([documentsPath UTF8String], &db) == SQLITE_OK))
{
NSLog(@"An error has occurred.");
}
NSString *insertSQL = [NSString stringWithFormat: @"insert into rc_otp_log_details values(null,%f,'%@','%@','%@',%f,%d)",old_otp,old_generated_at,old_msp_delivery_time,old_valid_upto,rc_profile_master_pm_id,otp_validity];
const char *sql = [insertSQL UTF8String];
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) == SQLITE_OK)
{
char *errMsg;
if (sqlite3_exec(db, sql, NULL, NULL, &errMsg) != SQLITE_OK) {
NSLog(@"Failed to create errMsg %s" ,errMsg);
sqlite3_finalize(sqlStatement);
sqlite3_close(db);
return false;
}
else
{
NSLog(@"inserted new");
sqlite3_finalize(sqlStatement);
sqlite3_close(db);
return true;
}
}
else
{
NSLog(@"insert statement problem");
sqlite3_finalize(sqlStatement);
sqlite3_close(db);
return true;
}
//
while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
NSLog(@"SQLITE_ROW %%d,SQLITE_ROW");
}
sqlite3_finalize(sqlStatement);
sqlite3_close(db);
return true;
}
@catch (NSException *exception) {
NSLog(@"An exception occured: %@", [exception reason]);
return false;
}
@finally {
return true;
}
}
您是否在第一次插入時收到異常?這似乎是您不關閉數據庫連接的唯一方式,這可能會導致鎖定狀態。 –
你好@Rob我可以提示哪裏改變部分代碼,我已經刪除while(sqlite3_step(sqlStatement)== SQLITE_ROW),因爲它不是必需的,但哪個是其他地方我需要更改代碼 – puja
其他一些代碼忘記了關閉連接。 –