0

Iphone アプリケーションに問題があります。アプリケーションが正常に実行されることがありますが、場合によっては「データベースがロックされているという例外」が発生するため、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");  

}
4

2 に答える 2

1

私は FMDB (SQLite 関数から私を隔離する SQLite ラッパー) を使用していることを告白しなければなりませんが、いくつかの点が奇妙に見えます。

  1. ステートメントを sqlite3_prepare_v2() する場合、sqlite3_finalize() は必要ありませんか?

  2. ここでデータベースを閉じているようですが、開いていません。sqlite3_open() ステートメントと sqlite3_close() 呼び出しのバランスが取れていない可能性があるようです。これが問題ではないと 100% 確信していますか? open ステートメントと close ステートメントに NSLog を入れて、バランスが取れていることを確認します。

これらの 2 つの問題の組み合わせにより、現在 sqlite3_close() がある場所で sqlite3_finalize() を意味していたのではないかと思います。

ほんの少しのアイデア。

于 2012-05-04T05:12:18.593 に答える
1

このリンクには、データベース ロック エラーが発生する理由が一覧表示されています。

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

理由の 1 つを引用します。

同じテーブルで SELECT がアクティブなときにテーブルに書き込もうとしています。

ステートメントで sqlite3_finalize を呼び出していないため、前の「SELECT」ステートメントが「INSERT」をブロックしている可能性があります。sqlite3_close を呼び出す前に、sqlite3_finalize を追加してみてください。

于 2012-05-04T05:34:33.170 に答える