次のメソッドを使用してsqliteテーブルにデータを追加しています。 このメソッドを使用すると、最初にレコードが挿入され、その後に2番目のレコードを追加するために「データベースがロックされています」というメッセージが表示されます。 助けていただければ幸いです。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;
}
}
最初の挿入時に例外が発生していますか?これは、データベース接続を閉じないとロックされた状態になる唯一の方法です。 –
こんにちは@ロブは、コードの一部を変更するためのヒントがありますが、(sqlite3_step(sqlStatement)== SQLITE_ROW)は必須ではありませんが、コードを変更する必要がある場所は他の場所です。 – puja
他のコードを忘れてしまった接続を閉じる。 –