1

テーブルからデータを選択しようとしました:

NSMutableArray *tmpArray = [[NSMutableArray alloc] init];
    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
        const char *sql = "SELECT name FROM Artists ORDER BY name";
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {


                char *nameChars = (char *)sqlite3_column_text(statement, 0);
                NSString *name = [NSString stringWithUTF8String: nameChars];

                [tmpArray addObject:name];
            }
        }else {
            NSLog(@"Error");
        }
    }else {
        NSLog(@"Error1");
    }

私はこれを選択し、その間にデータベース内の別のテーブルにデータを挿入します。

    -(void)insertAutpPlaylist:(NSString*)playlistName withPlaylist:(NSMutableArray*)songsArray{
    if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {
        for (int i = 0 ; i < [songsArray count]; i++) {

            SongItem *song = [songsArray objectAtIndex:i];

            sqlite3_stmt *insertStmt = nil;

            NSString *name = song.name; 

            if(insertStmt == nil) 
            {
                NSString *statement = [NSString stringWithFormat:@"INSERT INTO %@ (name) VALUES (?)",playlistName];
                const char *insertSql = [statement UTF8String];

                if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
                    NSLog(@"Error while creating insert statement.");
                    insertStmt = nil;
                    continue;
                }

                sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);

                if(SQLITE_DONE != sqlite3_step(insertStmt)){
                    //NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
                    NSLog(@"Error while inserting data.");
                    insertStmt = nil;
                    continue;
                }
                else{}

                sqlite3_reset(insertStmt);
                insertStmt = nil;
            }

        }

        sqlite3_close(database);
    }
}

このコードは、データの挿入と選択を同時に行わず、挿入と選択が異なるテーブルにある場合に正常に機能します。

編集

選択しようとすると、NSLog(@ "Error");から"Error"出力が表示されます。

編集2

sqlite3_errmsg(database)selectメソッドに追加すると、コンソールに表示されます。

reason: 'Error while inserting data. 'database is locked'
4

1 に答える 1

1

selectクエリの後、SQLステートメントを完成させてください

 sqlite3_finalize(statement);

そしてあなたの問題を解決します

于 2012-04-19T13:34:40.017 に答える