1

渡された構造体から char* 文字列を取得できません。次のコードがあります。

typedef struct {
    NSInteger id;
    char *title;
} Movie;

...

Movie movie = [self randomMovie];

NSInteger movieID = movie.id;
NSString *movieTitle = [NSString stringWithUTF8String:movie.title];
NSLog(@"movieTitle: %@", movieTitle);

...

- (Movie)randomMovie {
sqlite3_stmt *statement;
NSString *query = @"SELECT id, title FROM movies ORDER BY RANDOM() LIMIT 1;";

Movie movie;

if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
    if (sqlite3_step(statement) == SQLITE_ROW) {
        // Get the id and title of the first
        movie.id = sqlite3_column_int(statement, 0);
        movie.title = (char *)sqlite3_column_text(statement, 1);
    }
}

NSLog(@"Random movie %d title: %@", movie.id, [NSString stringWithUTF8String:movie.title]);

sqlite3_finalize(statement);
return movie;
}

これにより、出力が得られます。

2013-03-13 10:10:39.438 Fabflix[89156:c07] Random movie 872011 title: Ray
2013-03-13 10:10:39.439 Fabflix[89156:c07] movieTitle: (null)

タイトル文字列が randomMovie から正しく渡されない理由を知っている人はいますか? ありがとう!

4

2 に答える 2

2

私はsqlite3CAPIにあまり詳しくありませんが、sqlite3_finalize()呼び出しによって返されるC文字列が破棄されていないことを確認しsqlite3_column_text()ますか?あなたはstrdup()そのことをする必要があるかもしれません(そして後でそれを覚えておいてfree()ください)。

更新:うん、ドキュメントから:

返されるポインタは、上記のように型変換が行われるまで、またはsqlite3_step()またはsqlite3_reset()またはsqlite3_finalize()が呼び出されるまで有効です。文字列とBLOBを保持するために使用されるメモリスペースは自動的に解放されます。

于 2013-03-13T17:20:24.103 に答える
1

が返すメモリはsqlite3_column_text、 を呼び出すとすぐに解放されますsqlite3_finalize。最初に値を独自の文字列にコピーする必要があります。

typedef struct {
    NSInteger id;
    NSString *title;
} Movie;

/* ... */

movie.title =
    [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
于 2013-03-13T17:21:47.097 に答える