UPDATE查询仅适用于模拟器

时间:2012-06-30 18:12:17

标签: iphone database xcode sqlite

我正在使用firefox sqlite manager来帮助我构建一个iphone应用程序。其中我包含一个UPDATE查询,它在iPhone模拟器中完美运行。但是,当我从真机(iphone)运行时它失败了。没有错误,它只是不更新​​数据库。

我在考虑两个可能的原因: 1)它更新的数据库不是模拟器中的数据库 2)我读取的数据库不是更新的数据

有没有人有类似的经历?

代码如下:

        NSFileManager *fileMgr = [NSFileManager defaultManager];
        NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"Exercises.sqlite"];

        BOOL success = [fileMgr fileExistsAtPath:dbPath];
        if(!success)
        {
            NSLog(@"Cannot locate database file '%@'.", dbPath);
        }
        if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
        {
            NSLog(@"An error has occured.");
        }

        NSString *ranID = [@"UPDATE Status SET money = " stringByAppendingFormat:@"%d", money + 100];

        const char *sql2 = [ranID UTF8String];
        sqlite3_stmt *sqlStatement2;
        if(sqlite3_prepare(db, sql2, -1, &sqlStatement2, NULL) != SQLITE_OK)
        {
            NSLog(@"Problem with prepare statement 2");
        }
        if (sqlite3_step(sqlStatement2)==SQLITE_ROW) 
            NSLog(@"succeed");

提前致谢。

3 个答案:

答案 0 :(得分:0)

您正在尝试在捆绑包中的数据库内写入,您没有对捆绑包中文件的写入权限,如果要更新数据库,则需要将其复制到Documents目录

p>

复制数据库文件

NSString *documentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Exercises.sqlite"];

[[NSFileManager defaultManager] copyItemAtPath:dbPath toPath:documentsPath error:NULL];

然后始终使用新文件路径(documentsPath)来访问数据库

答案 1 :(得分:0)

应用套装中的文件在设备上是只读的。

您应首先将其复制到应用程序沙箱中的某个位置,例如在“库/应用程序支持”目录中。 (您可以在NSApplicationSupportDirectory中使用 - [NSFileManager URLsForDirectory:inDomains:]来查找此路径;请确保在尝试写入目录之前创建该目录。)

答案 2 :(得分:0)

这听起来好像你没有做出改变。查看类似帖子herehere