【发布时间】:2012-09-22 05:13:15
【问题描述】:
我已经为这个看似简单的问题苦苦挣扎了 48 小时,但我离解决方案还差得远。所以我希望有人能帮助我。
我正在构建一个应用程序,它使用本地 (SQLite) 数据库和在线数据库 (PHP/MYSQL) 的组合。该应用程序即将完成。检查泄漏并像魅力一样工作。然而,最后一部分是我一直在努力的部分。
在启动时,我希望应用程序检查在线数据库的更改,以及是否有更改。我希望它下载并解析包含更改的 xml 文件。到目前为止一切正常。但是,当我尝试将解析后的数据批量插入数据库时,应用程序崩溃,出现 NSInternalInconsistency 错误。由于数据库返回 SQLITE_MISUSE。我已经做了很多谷歌搜索,但仍然无法解决我的问题。所以我把代码放在这里,希望有人能帮我解决这个问题。
而且我知道我应该为此使用核心数据。但这是我正在努力的最后一部分,我现在非常不愿意更改我的整个代码。核心数据必须在更新中出现。
这是我收到的错误:
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“插入数据时出错。 '乱序调用的库例程''
这是我的代码:
-(void)UpdateDatabase:(const char *)_query NewValues:(NSMutableArray *)_odb dbn:(NSString *)_dbn dbp:(NSString *)_dbp
{
sqlite3 *database;
NSMutableArray *NewValues = _odb;
int i;
const char *query = _query;
sqlite3_stmt *addStmt;
for (i = 1; i < [NewValues count]; i++)
{
if(sqlite3_prepare_v2(database, query, -1, &addStmt, NULL) == SQLITE_OK)
{
sqlite3_bind_text(addStmt, 1, [[[NewValues objectAtIndex:i] name] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 2, [[[NewValues objectAtIndex:i] city]UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_double(addStmt, 3, [[[NewValues objectAtIndex:i] lat] doubleValue]);
sqlite3_bind_int(addStmt, 4, [[[NewValues objectAtIndex:i] long] doubleValue]);
sqlite3_bind_int(addStmt, 5, [[[NewValues objectAtIndex:i] code] intValue]);
}
if(SQLITE_DONE != sqlite3_step(addStmt)) {
NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
}
//Reset the add statement.
sqlite3_reset(addStmt);
}
}
【问题讨论】:
标签: iphone cocoa sqlite thread-safety