1

データの保存にsqliteデータベースを使用していますが、クエリの挿入中に「データベースがロックされています」というエラーが表示されます。コードは次のとおりです

 sqlite3_stmt    *statement;
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        const char *dbpath = [[defaults objectForKey:@"dbpath"] UTF8String];

        if (sqlite3_open(dbpath, &studentDB22) == SQLITE_OK)
        {
            NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO Emotion_videos (name) VALUES (\"%@\")",filePath];
            const char *query_stmt = [insertSQL UTF8String];
                if (sqlite3_prepare_v2(studentDB22, query_stmt, -1, &statement, NULL) == SQLITE_OK)
                {
                    NSLog(@"shi h2345");
                    if (sqlite3_step(statement) == SQLITE_ROW)
                    {
                        printf( "could not prepare statement: %s\n", sqlite3_errmsg(studentDB22));

                    }

                }
            sqlite3_finalize(statement);
        }
        else
        {
                   printf( "could not prepare statement: %s\n", sqlite3_errmsg(studentDB22));
        }

データを 2 ~ 3 回挿入できますが、再度実行するとデータベース ロック エラーが表示されます。

4

2 に答える 2

2

データベースを開きますが、閉じません。

クエリの作成に文字列形式を使用しないでください。あなたは入れるべきですか?クエリのプレースホルダーは、適切な値をバインドします。これにより、文字列値の適切な引用やエスケープなどの処理が行われます。

NSString *insertSQL = @"INSERT INTO Emotion_videos (name) VALUES (?)";

ステートメントを準備したら、呼び出しsqlite3_bind_textて文字列値をバインドします。

また。使用しないsqlite3_open、使用するsqlite3_open_v2。それはより良く、より多くの制御を提供します。

于 2012-10-31T04:17:08.823 に答える
0

データベース接続の作成中に、重要なステップの 1 つを逃しました:-

接続が既に作成されている場合は、接続を作成する前にデータベース接続を閉じます。

   if (sqlite3_open([[self dataFilePath] UTF8String], &database)
    != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database");
    }

関数の最後に使用します:-

sqlite3_close(database);
于 2012-10-31T07:23:51.220 に答える