我在NSAssert中使用errorMsg,但我只将其定义为NULL并且从未使用它来获取实际的错误消息。因此,它始终为NULL,并且无需在NSAssert中使用它。
< ...>
char *errorMsg = NULL;
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil)
== SQLITE_OK) {
sqlite3_bind_int(stmt, 1, i);
sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);
}
if (sqlite3_step(stmt) != SQLITE_DONE)
NSAssert(0, @"Error updating table: %s", errorMsg);
< ...>
有人会给出解决方案吗? 当我运行应用程序时,没有任何伤害。但是,当我按下主页按钮时,该过程暂停并向我显示:
2013-05-20 23:57:50.156 SQLite持久性[5373:c07] *断言失败 - [LPEViewController applicationWillResignActive:],/ Users / Me / Developer / SQLite Persistence / SQLite Persistence / LPEViewController.m :84 2013-05-20 23:57:50.158 SQLite持久性[5373:c07] 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'更新表时出错: (空)” * *第一掷调用堆栈:(0x2094012 0x11a1e7e 0x2093e78 0xc37665 0x3c09 0xc624f9 0x20ee0c5 0x2048efa 0xb96bb2 0xe2bb1 0xe2c3d 0xece0c 0xf5e74 0xf6beb 0xe8698 0x1fefdf9 0x1fefad0 0x2009bf5 0x2009962 0x203abb6 0x2039f44 0x2039e1b 0x1fee7e3 0x1fee668 0xe5ffc 0x2b4d 0x2a75)的libc ++ abi.dylib :terminate称为抛出异常(lldb)
答案 0 :(得分:1)
有几个问题:
您从未设置errorMsg
。确保将其设置为sqlite3_errmsg
(或直接使用该功能)。
您的自定义错误消息(“错误更新表”)也有点误导,因为它意味着您要报告表的名称,而您选择的变量名称建议您真的想要报告SQLite错误消息。
如果sqlite3_prepare_v2
失败,则不会报告任何错误消息。此外,如果sqlite3_prepare_v2
失败,您不会停止并报告错误,而是继续尝试调用sqlite3_step
,即使没有有效的语句要执行。问题在于它无疑会替换在sqlite3_prepare_v2
失败后收到的有意义的错误消息,其中包含一些关于以错误顺序执行语句的无用消息。
您不会检查sqlite3_bind
语句的成功或失败。这样做是明智的(虽然我怀疑你在sqlite3_prepare_v2
声明中更有可能失败)。
无论如何,也许你想要这样的东西:
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) != SQLITE_OK)
NSAssert(0, @"prepare failure: %s", sqlite3_errmsg(database));
if (sqlite3_bind_int(stmt, 1, i) != SQLITE_OK) {
sqlite3_finalize(stmt);
NSAssert(0, @"bind 1 failure: %s", sqlite3_errmsg(database));
}
if (sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL) != SQLITE_OK) {
sqlite3_finalize(stmt);
NSAssert(0, @"bind 2 failure: %s", sqlite3_errmsg(database));
if (sqlite3_step(stmt) != SQLITE_DONE) {
sqlite3_finalize(stmt);
NSAssert(@"step error: %s", sqlite3_errmsg(database));
}
sqlite3_finalize(stmt);
无论您是要使用NSAssert
还是仅NSLog
并立即返回,我都会按照您的意见,但此代码示例将检查更多SQLite失败情况并报告有意义的错误。