iOS アプリに sqlite db を使用しています。ここで、テーブルに行を挿入しようとしているときに、「データベースがロックされています」というエラーが表示されます。同じエラーに対して多くの質問が投稿され、多くの解決策と理由が示されていることに同意しますが、私のものはそれらのいずれでも解決されません。sqlite でのマルチスレッド化が禁止されている理由、データベースを開く必要がある、ファイナライズを呼び出す必要があるなどです。より透過的にするためにコードを投稿しています。
挿入機能
int open=sqlite3_open([@"/Users/macintosh/Documents/Apps/Project/MyLocal DB/MyLocal.sqlite" UTF8String], &database);
sqlite3_stmt *statement = NULL;
const char *sql = "insert into History (MNo,PID, Move,Result,WID, CreatedOn) Values( ?, ?, ?, ?, ?, ?)";
NSDateFormatter *DateFormatter=[[NSDateFormatter alloc] init];
[DateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
if(open==SQLITE_OK)
{
if (sqlite3_prepare(database, sql, -1, &statement, NULL) ==SQLITE_OK)
{
sqlite3_bind_int(statement, 0, mid);
sqlite3_bind_int(statement, 1, pid);
sqlite3_bind_int(statement, 2, cno);
sqlite3_bind_int(statement, 3, result);
sqlite3_bind_int(statement, 4, wid);
sqlite3_bind_text(statement, 5, [[DateFormatter stringFromDate:[NSDate date]] UTF8String], -1, SQLITE_TRANSIENT);
if (sqlite3_step(statement)==SQLITE_DONE)
{
NSLog(@"inserted the values in table");
}
else
{
NSLog(@" not inserted the values in table");
NSLog(@"error: %s", sqlite3_errmsg(database));
}
sqlite3_finalize(statement);
}
else
{
NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(database));
}
sqlite3_close(database);
NSLog(@"db closed");
}
else
{
NSLog(@"An error has occured: %s",sqlite3_errmsg(database));
}
注:行を挿入するために多くの場所で同じ関数を使用しましたが、うまく機能します。このエラーが発生しました。このステートメントの実行中に、同じデータベースで他のステートメントが実行されていないことを確認しました。