SQLite数据库不会更新

时间:2012-12-13 16:48:30

标签: iphone objective-c ios sqlite

我有一个拥有学生实体的数据库:

create table student ( name varchar(20) not null,
                       surname varchar(20) not null,
                       studentId integer primary key );

在应用程序启动时的app appate中,我从数据库中加载所有元组并将它们显示到表视图中。
当app委托接收者applicationWillResignActive事件时,它会将所有元组保存到数据库中。它只保存已添加的元组,没有可能编辑元组,所以没关系。
当app委托收到applicationWillEnterForeground事件时,它会从数据库中读取元组。

问题:这只适用于单次启动应用程序。让我说我通过Xcode启动应用程序,然后输入我添加一个元素并输入后台。之后我重新激活应用程序,它进入前台,并成功加载所有元组 但是在下一次启动应用程序时(从lldb停止并再次启动它),元组与第一次启动时相同。

我为学生实体创建了一个包装类,名为Student,具有以下属性:

@property (nonatomic, copy, readwrite) NSString* name;
@property (nonatomic, copy , readwrite) NSString* surname;
@property (nonatomic, strong, readwrite) NSNumber* studentId;
@property (nonatomic, readwrite, getter= isNew) BOOL new;

我检查字段是否为零并且不违反实体完整性 我使用的唯一有意义的方法是:

- (NSString*) sqlInsertionString;

它创建插入元组所必需的字符串。经过测试和工作。

这就是我更新数据库的方式:

- (void) updateStudents : (NSMutableArray*) students
{
    sqlite3* database;
    sqlite3_stmt* statement;
    BOOL needsFinalize=NO;
    if(!databasePath)
    {
        NSBundle* bundle=[NSBundle mainBundle];
        databasePath= [bundle pathForResource: @"test" ofType: @"db"];
    }
    if(sqlite3_open([databasePath UTF8String], &database)!=SQLITE_OK)
    {
        NSString* problem= [NSString stringWithFormat: @"%s",sqlite3_errmsg(database)];
        @throw [NSException exceptionWithName: @"Failed to open the database" reason: problem userInfo: nil];
    }
    for(Student * s in students)
    {
        if(s.isNew)
        {
            NSString* sqlString= [s sqlInsertionString];
            if(sqlite3_prepare_v2(database, [sqlString UTF8String], -1, &statement, NULL)!= SQLITE_OK)
            {
                @throw [NSException exceptionWithName: @"Problem performing the query" reason: @"Unknown" userInfo: nil];
            }
            if(sqlite3_step(statement)!=SQLITE_DONE)
            {
                @throw [NSException exceptionWithName: @"Problem performing the query" reason: @"Unknown" userInfo:nil];
            }
            sqlite3_reset(statement);
            needsFinalize=YES;
        }
    }
    if(needsFinalize && sqlite3_finalize(statement)!=SQLITE_OK)
    {
        @throw [NSException exceptionWithName: @"Failed to close the statement resource" reason: @"Unknown" userInfo:nil];
    }
    if(sqlite3_close(database)!= SQLITE_OK)
    {
        @throw [NSException exceptionWithName: @"Failed to close the database" reason: @"Unknown" userInfo: nil];
    }
}

但它没有真正更新,只在应用程序内部看起来更新,但文件始终保持不变。

1 个答案:

答案 0 :(得分:2)

问题是您要从捆绑包中打开数据库。你无法对其进行(持久)修改。标准解决方案是检查Documents文件夹中的数据库,如果有,请使用它,如果没有,请从包中复制到Documents,然后从Documents打开数据库。

请参阅Unable to connect SQLite Database in iOS