0

紳士淑女、

iOSアプリケーションでFMDBを使用しています。私は255バイトを超える列にいくつかのテキストを持っています。BASEを使用してデータベースファイルを参照すると、列のデータの長さをクエリできます...したがって、データがそこにあり、255より長いことがわかります...

しかし、これらの列からデータを取り出そうとすると、常に正確に255バイトのC文字列が取得され、その理由はまったくわかりません。

これがいくつかのコードです(基本的にはFMDB FMResultSet.mの-(NSString *)stringForColumnIndex:(int)columnIdx {からのもので、すでにそこにあるエラーをトラップできます。

- (NSString*)stringForColumnIndex:(int)columnIdx {

if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) {
    return nil;
}

const char *c = (const char *)sqlite3_column_text([_statement statement], columnIdx);

int xx = strlen(c); //added by me, already here it is only 255 bytes


if (!c) {
    // null row.
    return nil;
}
return [NSString stringWithUTF8String:c];
}

私は何が欠けていますか?私は標準で提供されているlibsqlite3.dylibを使用していますが、FMDBにはsqlite.hが含まれています。私は今何時間も役に立たないように同様の問題をグーグルしようとしました。

4

1 に答える 1

0

これはFMDBでもSQLiteの制限でもありません。FMDBを使用して、SQLiteデータベースから常に255文字を超える文字列を返します。私はちょうどチェックしました:

    FMResultSet *rs = [fmdb executeQuery:@"select personnel_description from personnel where personnel_id=297"];
    [rs next];
    NSString *test2 = [rs stringForColumnIndex:0];
    NSLog(@"%s len=%d string=%@", __FUNCTION__, [test2 length], test2);
    [rs close];

そして、BASEが教えてくれたのと同じ長さの8429文字列を取得しました。

これにより、データに何か奇妙なことがあるのではないかと思います(たとえば、文字の代わりにバイナリデータ、DBCSなど)。文字列ではなくオブジェクトとして返して、それを調べてみましたか?おそらく、それがNSStringであり、NSDataの結果セットではないことを確認します。例:

    id test3 = [rs objectForColumnIndex:0];
    if ([test3 isKindOfClass:[NSString class]])
        NSLog(@"It's a string");
    else
        NSLog(@"It's not");

これがFMDBの問題であると本当に思われる場合は、FMDBディスカッションにこの質問を投稿してみてください。また、同じサイトから取得できる最新のFMDBコードがあることを確認します。

于 2012-04-30T21:32:48.473 に答える