sqLite iOS提交失败

时间:2013-09-26 20:30:09

标签: ios objective-c sqlite

背景:我们的应用程序具有“架构更新”例程。它基本上检查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];

...

2 个答案:

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

将它放入辅助函数可能很有用。

答案 1 :(得分:0)

事实证明,问题与在正确的时间不初始化对象有关。当代码首次执行时,对象没有被初始化,但是通过退出和返回,对象被另一个例程激活,这创建了上述行为。

我们更新了代码,以确保上述例程初始化了对象,而不依赖于代码执行的顺序。