2013-09-26 95 views
0

背景:我們有一個具有「模式更新」例程的應用程序。它基本上檢查用於sqLite的編譯指示user_version,如果用戶正在運行較舊的模式,則將其更新爲當前的dB模式,然後在更新模式後更新編譯指示版本。代碼在啓動時(通過應用程序委託)通過調用我們的dbManager代碼執行架構更新來執行。sqLite iOS提交失敗

問題:我們更新了代碼(下同)增加對下一個版本和說明更新user_version到3的改變了我們的問題是,當我們做一個新安裝的應用程序的(刪除以前的版本),我們發現第一次運行應用程序時,下面的代碼執行時沒有任何錯誤(我們逐行執行了這麼多次),但沒有發生任何更改。然後我們退出應用程序(點擊主頁按鈕),點擊應用程序圖標,代碼再次運行(它沒有更新user_version,因此它認爲它運行的是舊模式),並且這次所有更改都已提交。

我們試過了什麼:我們已經仔細檢查了數據庫的路徑以確保它是正確的,它是 - 我們兩次更新同一個數據庫。我們已經逐行閱讀,我們刪除了代碼,試圖挑選出一行代碼。我們試圖弄清楚,如果緩存沒有提交更改,但我們有一個「定稿」調用來強制刷新,並且我們經常關閉我們的數據庫以確保我們不會把它留在外面。

該代碼已在所有以前版本的應用程序中運行,沒有問題。我們唯一的改變是添加下面的「Alter Table」代碼。 (我們拿出來,仍然有上面的問題)。經過幾天的死路,我們想知道有沒有人看過這個或有什麼想法?

我們在XCode中的與iOS 7

任何反饋最新的版本上運行,將不勝感激。

我們的代碼...

....

如果(currentlyInstalledDBScehmaVersion < 3)//升級一個的dbschema之前版本3 {

 /* 
     Upgrade Description: 

     All schemas prior to version 3, need to add the evolWarmUpTime and evolCoolDownTime columns to tblPlayerProfile 
     */ 

     @try 
     { 
      if (sqlite3_open([sfcDatabasePath UTF8String], &dbSFC) == SQLITE_OK) 
      { 
       sqlite3_stmt *sqlStatement; 

       sqlUpgradeCommands = @"ALTER TABLE tblPlayerProfile ADD evolWarmUpTime INTEGER(2) DEFAULT 4"; 
       const char *sqlQueryAddWarmUp = [sqlUpgradeCommands UTF8String];; 

       if (sqlite3_prepare_v2(dbSFC, sqlQueryAddWarmUp, -1, &sqlStatement, NULL) == SQLITE_OK) 
       { 
        if(SQLITE_DONE != sqlite3_step(sqlStatement))NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(dbSFC)); 
       } 
       sqlite3_finalize(sqlStatement); 

       sqlUpgradeCommands = @"ALTER TABLE tblPlayerProfile ADD evolCoolDownTime INTEGER(2) DEFAULT 5"; 
       const char *sqlQueryAddCoolDown = [sqlUpgradeCommands UTF8String];; 

       if (sqlite3_prepare_v2(dbSFC, sqlQueryAddCoolDown, -1, &sqlStatement, NULL) == SQLITE_OK) 
       { 
        if(SQLITE_DONE != sqlite3_step(sqlStatement))NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(dbSFC)); 
       } 
       sqlite3_finalize(sqlStatement); 
      } 
     } 
     @catch (NSException *exception) 
     { 
      upgradeErrorOccurred = YES; 
      NSLog(@"dbManager_SFC:upgradeScheme exception occured: %@", [exception reason]); 
     } 

     sqlite3_close(dbSFC); 
    } 

    if (upgradeErrorOccurred == NO) 
    { 
     [self updateDBVersion:3]; //Upgrade the schema version number! 
    } 
    [self hideUpgradeAlertFromUser]; 

即是。 ...

+0

你確定你第一次引用正確的文件嗎?在進行文件初始化之前是否可能打開數據庫? –

+0

熱舔 - 這是問題 - 我們沒有在正確的時間初始化我們的物體之一。我們更新了代碼,以便上面的例程將初始化幫助程序對象,並消除需要執行順序的依賴。感謝您指引我們走向正確的方向。 –

回答

0

事實證明,這個問題與在適當的時候不初始化對象有關。當代碼第一次執行時,對象沒有被初始化,但是通過退出和返回,對象被另一個例程激活,該例程創建了上述行爲。

我們更新了代碼,以確保該對象已由上述例程初始化,而不依賴於代碼執行的順序。

0

sqlite3_prepare_v2sqlite3_step可能會失敗,但只爲後者輸出錯誤。

使用這樣的事情:

if (sqlite3_prepare_v2(dbSFC, sql, -1, &sqlStatement, NULL) != SQLITE_OK || 
    sqlite3_step(sqlStatement) != SQLITE_DONE) 
{ 
    NSAssert1(0, @"Error while updating: %s", sqlite3_errmsg(dbSFC)); 
} 
sqlite3_finalize(sqlStatement); 

這可能是有用的,把這個變成一個輔助功能。

+0

感謝您的建議,並同意這是一種更簡潔的方式來構建代碼 - 不幸的是,在實施您的建議時,我們沒有得到任何錯誤。它仍然像我們上面所說的那樣運行 - 首先運行它全部執行,但架構中沒有任何更改,第二次運行它再次執行並且提交更改。 –