【问题标题】:SQLite bulk insert on iPhone not workingiPhone上的SQLite批量插入不起作用
【发布时间】: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


    【解决方案1】:

    我在寻找其他东西时偶然发现了这一点。我假设 App_beginner 终于注意到他在尝试使用数据库之前从未打开过它。

    sqlite3_open([dbPath UTF8String], &database);
    

    只是以为我会为其他人发布(似乎是答案)

    【讨论】:

      【解决方案2】:

      我在您的代码中注意到的一件事是,当您向对象询问它的​​ doubleValue 时,查询参数 #4 绑定到一个 int。

      另外,你确定输入对象没问题吗?您可能需要添加一些断言以确保其所有字段都不是 nil。

      【讨论】:

      • 我尝试将 bind_int 更改为 bind_double。感谢您发现这一点。但是我仍然遇到同样的错误。我也尝试过检查我的对象,但它们都返回了它们的预期值。所以这也不是问题。
      【解决方案3】:

      我相信我刚刚解决了同样的问题。解决方法是调用:

      sqlite3_reset(insert_statement); 
      

      在 for 循环中的插入迭代之间(在每次迭代结束时)。

      【讨论】:

        猜你喜欢
        • 2011-01-27
        • 1970-01-01
        • 2016-09-24
        • 2015-05-16
        • 1970-01-01
        • 1970-01-01
        • 2013-01-20
        • 2013-07-13
        • 2013-10-01
        相关资源
        最近更新 更多