iOS中执行SQLite查询时出现EXC_BAD_ACCESS错误求助
解决iOS SQLite插入时触发的EXC_BAD_ACCESS错误
从你贴出的SQL插入语句来看,大概率是这几个问题导致了崩溃:
- 未转义字符串中的单引号:如果你的字段值里包含单引号(比如类似"I'm feeling well"这种内容),直接拼接进SQL语句会破坏语法结构,轻则引发SQL语法错误,重则触发内存访问异常。
- 语句被截断未闭合:你的SQL末尾是
Do you partake in any recr...,明显是字符串被截断了,没有完整闭合引号和括号,SQLite解析器无法正确处理这种不完整语句,进而导致崩溃。 - 直接拼接字符串的内存风险:用NSString直接拼接超长SQL语句时,若内存管理不当或者字符串长度超出预期,也可能触发EXC_BAD_ACCESS。
最优解决方案:使用参数化查询(绑定变量)
这是避免SQL注入、语法错误和内存问题的标准做法,示例代码如下:
// 用占位符?代替直接拼接的字段值 NSString *insertSQL = @"INSERT INTO tbl_assessment (Question, Answer, Option1, Option2, Option3, Explanation, Used, ImageName, Reference) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; sqlite3_stmt *statement; // 预处理SQL语句 if (sqlite3_prepare_v2(database, [insertSQL UTF8String], -1, &statement, NULL) == SQLITE_OK) { // 依次绑定各个字段的值 sqlite3_bind_text(statement, 1, [questionStr UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(statement, 2, [answerStr UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(statement, 3, [option1Str UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(statement, 4, [option2Str UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(statement, 5, [option3Str UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(statement, 6, [explanationStr UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_int(statement, 7, usedInt); // 假设Used是整数类型 sqlite3_bind_text(statement, 8, [imageNameStr UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(statement, 9, [referenceStr UTF8String], -1, SQLITE_TRANSIENT); // 执行插入操作 if (sqlite3_step(statement) != SQLITE_DONE) { NSLog(@"插入失败: %s", sqlite3_errmsg(database)); } // 释放语句资源 sqlite3_finalize(statement); } else { NSLog(@"预处理SQL失败: %s", sqlite3_errmsg(database)); }
额外检查项
- 确认你的SQLite数据库连接
database是有效的,没有被提前释放。 - 若字段值可能为nil,绑定的时候用
sqlite3_bind_null处理,避免传入空指针触发崩溃。 - 确保所有要插入的字段值都是完整的,不会出现截断情况。
内容的提问来源于stack exchange,提问作者Pankaj Mundra
相关产品推荐
相关产品推荐

