我有一个问题...我有一个使用sqlite的应用程序来保存一些数据。一切都很完美,这意味着我可以添加,删除,查看数据。当应用程序进入后台时,数据是持久的。现在,当我从内存中删除应用程序或重启iPhone时,数据库已损坏,所有数据都搞砸了!
我有一个类调用dbAccess,其中定义了所有数据库操作(添加,删除,检索行)。最后,我有一个finalize操作,最终确定所有使用的语句,然后关闭数据库。
+ (void)finalizeStatements{
NSLog(@"Finalizing the Delete Statements");
if(deleteStmt) {
NSLog(@"Delete Statement exist... finalization");
sqlite3_finalize(deleteStmt);
deleteStmt = nil;
}
NSLog(@"Finalizing the Add Statements");
if(addStmt) {
NSLog(@"Add Statement exist... finalization");
sqlite3_finalize(addStmt);
addStmt = nil;
}
NSLog(@"Finalizing the Store Statements");
if(storeStmt) {
NSLog(@"Store Statement exist... finalization");
sqlite3_finalize(storeStmt);
storeStmt = nil;
}
NSLog(@"Finalizing the Agent Statements");
if(agentStmt) {
NSLog(@"Agent Statement exist... finalization");
sqlite3_finalize(agentStmt);
agentStmt = nil;
}
NSLog(@"Closing the Database");
if(database) {
NSLog(@"The database exist... closing it");
sqlite3_close(database);
}
}
当applicationDidEnterBackground和applicationWillTerminate时,应用程序委托调用此方法。在applicationDidBecomeActive时调用openDatabase方法。
有关数据库损坏的任何想法?
感谢。
答案 0 :(得分:2)
首先,查看fmdb或其他一些经过验证的包装器。您也可以浏览代码。
不确定是否有足够的信息来了解它为什么会损坏。但是,您应该从所有 sqlite3_xxx调用中获取返回代码,并至少记录以了解正在发生的事情,或者您可能只是遇到问题。
另外,请确保调用sqlite_errmsg,如果返回代码不成功,将提供更多线索。
在我的包装中,我是近距离完成的。如果没有,预计会最终确定报表。我有一个语句缓存,清除完成每个语句。 :
- (void)close
{
if (_sqlite3)
{
NSLog(@"closing");
[self clearStatementCache];
int rc = sqlite3_close(_sqlite3);
NSLog(@"close rc=%d", rc);
if (rc == SQLITE_BUSY)
{
NSLog(@"SQLITE_BUSY: not all statements cleanly finalized");
sqlite3_stmt *stmt;
while ((stmt = sqlite3_next_stmt(_sqlite3, 0x00)) != 0)
{
NSLog(@"finalizing stmt");
sqlite3_finalize(stmt);
}
rc = sqlite3_close(_sqlite3);
}
if (rc != SQLITE_OK)
{
NSLog(@"close not OK. rc=%d", rc);
}
_sqlite3 = NULL;
}
}