【问题标题】:EXC_BAD_ACCESS on inserting插入时的 EXC_BAD_ACCESS
【发布时间】:2012-09-15 03:13:44
【问题描述】:

我正在使用 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 错误。为什么?

【问题讨论】:

  • 如果你已经解决了问题,你仍然需要接受你自己的答案。这将标记问题已关闭。

标签: sqlite insert exc-bad-access fmdb


【解决方案1】:

问题已解决!
*1.*提供给-executeUpdate: 方法(或任何接受va_list 作为参数的变体)的所有参数都必须是对象。以下将不起作用(并将导致在崩溃中):
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", 66];
插入数字的正确方法是将其放入 NSNumber 对象中:
[db executeUpdate:@"INSERT INTO mytable VALUES (?)", [NSNumber numberWithInt:66]];
*2.*或者,您可以使用-execute*WithFormat: 变体来使用NSString 样式替换:
[db executeUpdateWithFormat:@"INSERT INTO mytable VALUES (%d)", 66];
在内部,-execute*WithFormat: 方法为您正确装箱。以下百分比修饰符被识别:
%@,%c,%s,%d,%D,%i,@987654336 @,%U,%hi,%hu,%qi,%qu,%f,%ld,%lu,%lld,和%llu.
否则会产生不可预知的结果。如果由于某种原因,您需要在 SQL 语句中出现 % 字符,则应使用 %%

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2012-05-10
    • 2013-11-04
    • 1970-01-01
    • 2012-04-04
    • 2017-04-03
    相关资源
    最近更新 更多