objective c - iPhone - 替换sqlite数据库的本地副本

时间:2012-03-19 11:34:02

标签: iphone objective-c database sqlite persistence

我在我的iPhone应用程序中使用sqlite数据库,在我的应用程序生命周期中,用户可能会添加一些新记录。我的问题是,当用户关闭电话/关闭应用程序时,这些记录会丢失,并且应用程序会加载数据库的原始版本而不添加记录。

我想知道的是,有什么方法可以用用户实际创建的版本替换存储在iPhone上的数据库的本地副本,并附加新记录?如果我实际上无法替换数据库,那么为了使新记录持续存在,最佳做法是什么?

谢谢,

杰克

编辑:数据库存储在文档目录中。

编辑2:

基本上,如果运行以下代码,我将如何提交insert语句所做的更改,以便更新数据库的应用程序主版本而不仅仅是临时副本?

-(void)insertData{

    sqlite3 *database;
    sqlite3_stmt *statement;

    //Get the path to the documents directory and append the databaseName
    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
    NSString *databasePath = [appDelegate m_DatabasePath];
    NSLog(@"%@", [appDelegate m_DatabasePath]);
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {

        NSString *insertSQL = @"INSERT INTO products (name,category,calories, saturates,fat,fibre,sugar,salt, image) VALUES ('Snickers',' Confectionary','300','55','55','55','55','55', 'http://upload.wikimedia.org/wikipedia/en/8/88/Snickers_wrapped.jpg');";
        const char *insert_stmt = [insertSQL UTF8String];
        if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL)== SQLITE_OK)
        {
            NSLog(@"Here 1");
            if(sqlite3_step(statement)==SQLITE_DONE) 
            {
                //Create a new animal object with the data from the database
                Product *l_Product = [[Product alloc] initWithName:@"Snickers" category:@"Confectionary" calories:@"300" fat:@"55" saturates:@"50" sugar:@"10" fibre:@"50" salt:@"5" imageURL:@"http://upload.wikimedia.org/wikipedia/en/8/88/Snickers_wrapped.jpg" ];

                //Add the animal object to the animals array
                [appDelegate.m_Products addObject:l_Product];

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Added" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];    
                [alert show];

            }
            else 
            {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Not Added" message:@"An error has occured" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
                [alert show];
                alert=nil;
            }   
        }
        // Release the compiled statement from memory
        sqlite3_finalize(statement);    
        sqlite3_close(database);
    }
}

3 个答案:

答案 0 :(得分:0)

应用必须提交用户做出的更改

类似的东西(取自similar thread

char* errmsg;
int result = sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);

查看文档http://www.sqlite.org/search?q=commit

答案 1 :(得分:0)

如果SQLite DB在重新启动时被替换,那么你可能在代码中做错了。

不是在应用程序的资源中运送SQLite DB,而是动态创建数据库。每次应用程序启动时都会运行一些初始化代码来创建数据库。这些陈述应该是: -

create TABLE if not exists...

如果您这样做并正确连接到数据库,那么您应该发现它可以作为持久存储。

不要忘记您还需要先创建数据库(再次,'如果不存在')和任何索引。

答案 2 :(得分:0)

您可以在应用程序包中提供数据库,只需确保在进行更改之前将“裸”数据库复制到文档目录(可能在启动后的 appDidFinishLaunching 委托方法中)。这也将使用户能够在将来保持数据完整性的同时更新应用程序。