Данные SQLite iphone теряются при перезагрузке или закрытии приложения - PullRequest
1 голос
/ 28 августа 2011

У меня вопрос ... У меня есть приложение, использующее 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. Метод openDatabase вызывается, когда applicationDidBecomeActive.

Есть идеи, почему база данных повреждена?

Спасибо.

1 Ответ

2 голосов
/ 28 августа 2011

Прежде всего, проверьте fmdb или некоторые другие проверенные оболочки.Вы также можете просмотреть код.

Не уверен, достаточно ли информации, чтобы понять, почему он поврежден.Но вы должны получить коды возврата от вызовов ALL 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...