背景:我們有一個具有「模式更新」例程的應用程序。它基本上檢查用於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];
即是。 ...
你確定你第一次引用正確的文件嗎?在進行文件初始化之前是否可能打開數據庫? –
熱舔 - 這是問題 - 我們沒有在正確的時間初始化我們的物體之一。我們更新了代碼,以便上面的例程將初始化幫助程序對象,並消除需要執行順序的依賴。感謝您指引我們走向正確的方向。 –