1

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));
}

注:行を挿入するために多くの場所で同じ関数を使用しましたが、うまく機能します。このエラーが発生しました。このステートメントの実行中に、同じデータベースで他のステートメントが実行されていないことを確認しました。

4

3 に答える 3

4

このデータベースを閉じるのを忘れていたと思います。そのため、このエラーが発生しています

于 2013-04-29T09:22:30.693 に答える
2

多くの場合、この種のエラーが発生した場合、アプリ内に同じデータベースに同時にアクセスしようとする並列プロセスがあります。その場合は、次のように入力してみてください。

sqlite3_busy_timeout(database, 500);

sqlite3_opensqlite3_prepareコードの間のどこかに。

次に、データベース接続は 500 ミリ秒で読み取り/書き込みを試みますが、これは通常、ロックを回避するのに十分な時間です。

于 2015-06-23T15:48:09.083 に答える