背景:我们的应用程序具有“架构更新”例程。它基本上检查sqLite的pragma user_version,如果用户正在运行较旧的模式,则将其更新为当前的dB模式,然后在更新模式后更新pragma版本。代码在启动时(通过app委托)执行,方法是调用我们的dbManager代码来执行模式更新。
问题:我们更新了代码(如下)以添加下一版本的更改,并按照说明将user_version更新为3.我们的问题是,当我们全新安装应用时(删除以前的版本)我们发现第一次运行应用程序时,下面的代码执行时没有任何错误(我们逐行地逐步执行了很多次)但是没有进行任何更改。然后我们退出应用程序(点击主页按钮),点击应用程序图标并再次运行代码(它没有更新user_version,因此它认为它正在运行旧架构),这次所有更改都已提交。
我们尝试了什么:我们已经仔细检查了数据库的路径,以确保它是正确的,它是 - 我们两次更新同一个数据库。我们逐行浏览,我们已经删除了试图挑出一行代码的代码。我们试图弄清楚是否有一个缓存没有提交更改,但我们有一个“finalize”调用来强制刷新,我们经常关闭我们的数据库,以确保我们不会让它停止。< / p>
该代码适用于所有以前版本的应用程序,没有任何问题。我们唯一的变化是在下面添加“Alter Table”代码。 (我们把它拿出来仍然有上面的问题)。经过几天的死胡同,我们想知道是否有人看过这个或有任何想法?
我们正在运行最新版本的iOS 7 XCode。
非常感谢任何反馈。
我们的代码......
...
if(currentInstalledDBScehmaVersion&lt; 3)//升级版本3之前的dbSchema {
/*
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)
sqlite3_prepare_v2
和sqlite3_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);
将它放入辅助函数可能很有用。
答案 1 :(得分:0)
事实证明,问题与在正确的时间不初始化对象有关。当代码首次执行时,对象没有被初始化,但是通过退出和返回,对象被另一个例程激活,这创建了上述行为。
我们更新了代码,以确保上述例程初始化了对象,而不依赖于代码执行的顺序。