4

SQL 以外のバックグラウンドから来て、3 つのフィールドを持つ test という名前の単純なテーブルを作成します。

    NSString *testtable = @"create table if not exists test(testid integer primary key, userid integer, contentid text)";
if (![db executeUpdate:testtable]) {
    NSLog(@"create test, %d:%@", [db lastErrorCode], [db lastErrorMessage]);
    return NO;
}

テーブルにレコードを挿入すると、exc_bad_access エラーが発生しました。

    if (![db executeUpdate:@"insert into test values(?,?,?)", NULL, 1, @"HELLO"]) {
    NSLog(@"insert test, %d:%@", [db lastErrorCode], [db lastErrorMessage]);
    return NO;
}

列の「userid」タイプを整数からテキストに変更すると、うまく機能します。そして、コンソールでsqliteコマンドを使用してテーブルをテストしましたが、うまく機能します。皆さんはどう思いますか?ありがとう...

この問題を処理する別の方法を試します。

    if (![db executeUpdate:@"insert into test values(?,?,?)", NULL, [NSNumber numberWithInt:1], @"HELLO"]) {
    NSLog(@"testint, %d:%@", [db lastErrorCode], [db lastErrorMessage]);
    return NO;
}

それは動作します。理由はわかりません... fmdb はオブジェクトの挿入しかサポートしていないのかもしれません。

4

2 に答える 2

2

FMDB には ? を置き換えるオブジェクトが必要だと思います。int はオブジェクトではありません。1をに変更[NSNumber numberWithInt:1]

また、データベースを開くと、このようなものがありますか?

db = [FMDatabase databaseWithPath:writableDBPath];

    if ([db open]) {

直後に追加[db setTraceExecution:TRUE];すると、SQL テキストが nslog されます。

最初に SQL NSString を作成し、int を挿入してから、FMDB に既に取り込まれた文字列を実行させることができます。

于 2012-05-15T14:39:40.777 に答える
0

executeUpdate: プレースホルダー値として渡されるオブジェクトのみをサポートします。printf スタイルの引数が必要な場合は、executeQueryWithFormat: を使用できます (数値を表すために %d を使用できます)。executeQueryWithFormat: とにかく値をオブジェクトに変換することになるので、個人的にはオブジェクトに固執します。

于 2012-05-15T18:45:49.177 に答える