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:方法的所有参数(或任何接受 ava_list作为参数的变体)必须是对象。以下将不起作用(并会导致崩溃):
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", 66];
插入数字的正确方法是将它装箱到一个NSNumber对象中:
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", [NSNumber numberWithInt:66]];
* 2. *或者,您可以使用-execute*WithFormat:变体来使用NSString-style 替换:
[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 回答