0

FMDatabaseを使用してsqlite3データベースを操作しています。これが私のコードです:

NSString *dbFilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"temp_info.db"]];

FMDatabase *fmdb = [FMDatabase databaseWithPath:dbFilePath];
if (![fmdb open]) {
    NSLog(@"......");
} else {
    NSString *sql = @"CREATE TABLE IF NOT EXISTS test1(id INTEGER, name TEXT, create_time TEXT)";
    if (![fmdb executeUpdate:sql]) {
        NSLog(@"......");
    }
    for (int i = 0; i < 3; i++) {
        BOOL result = [fmdb executeUpdate:@"INSERT INTO test1(id, name, create_time) values(?,?,?)", i+1, @"test", @"12-09-10 12:10"];
        NSLog(@"%d", result);
    }
    // EXC_BAD_ACCESS
}

私がラインを走らせるとき:

BOOL result = [fmdb executeUpdate:@"INSERT INTO test1(id, name, create_time) values(?,?,?)", i+1, @"test", @"12-09-10 12:10"];

EXC_BAD_ACCESSエラーが発生します。なんで?

4

1 に答える 1

9

疑問が解決しました!
* 1.-executeUpdate: *メソッド (またはパラメーターとして a を受け入れるバリアントのいずれか) に提供されるすべての引数は、va_listオブジェクトである必要があります。以下は機能しません (クラッシュが発生します)
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", 66];
: * 2. *代わりに、バリアントを使用して -style置換を使用することもできます:NSNumber内部 的には、メソッドは適切にボックス化されます。次のパーセント修飾子が認識されます: , , , , , , , , , , , , , _
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", [NSNumber numberWithInt:66]];
-execute*WithFormat:NSString
[db executeUpdateWithFormat:@"INSERT INTO mytable VALUES (%d)", 66];
-execute*WithFormat:
%@%c%s%d%D%i%u%U%hi%hu%qi%qu%f%ld%lu%lld、および%llu
これら以外の修飾子を使用すると、予測できない結果が生じます。何らかの理由で%、SQL ステートメントにその文字を表示する必要がある場合は、%%.

于 2012-09-15T12:08:02.210 に答える