重启或关闭应用程序时,SQLite iphone数据丢失

时间:2011-08-28 01:07:54

标签: objective-c sqlite

我有一个问题...我有一个使用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方法。

有关数据库损坏的任何想法?

感谢。

1 个答案:

答案 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;
    }
}