应用程序的更新版本的本地应用程序数据库将相同

时间:2011-11-04 04:48:17

标签: iphone database sqlite versioning local-database

我在应用商店中有一个应用程序。它有本地数据库,用户可以存储一些信息。现在我打算发布该应用程序的第二个版本。我的问题是,用户在第一个版本的应用程序中输入的数据是否会在第二个版本中提供,或者是否为空白。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您需要在代码中测试以前的版本并以编程方式合并它们。

这样的事情:

- (void)merge {
    NSString *dataDir = Doogie(@"data");
    NSString *sqlDir  = Doogie(@"sql");
    NSString *dataPath = PathAppend(dataDir, @"name.db");
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) {
        ILogPlus(@"%@", @"No merge necessary");
        return;
    }
    const char *oldDBPath = [dataPath UTF8String];
    const char *mainDBPath = [PathAppend(sqlDir, @"name.db") UTF8String];
    sqlite3 *mainDB;
    if (sqlite3_open(mainDBPath, &mainDB) == SQLITE_OK) {
        NSString *attachSQL = [NSString stringWithFormat: @"ATTACH DATABASE \'%s\' AS old_db", oldDBPath];
        char *errorMessage;
        if (sqlite3_exec(mainDB, [attachSQL UTF8String], NULL, NULL, &errorMessage) == SQLITE_OK) {
            sqlite3_stmt *selectStmt;

            NSString *selectSQL = @"insert into main.favorites select * from old_db.favorites";
            if (sqlite3_prepare_v2(mainDB, [selectSQL UTF8String] , -1, &selectStmt, nil) == SQLITE_OK) {
                while (sqlite3_step(selectStmt) == SQLITE_ROW) {
                    //do something
                }
            }
            else {
                NSLog(@"Error while creating select statement: '%s'", sqlite3_errmsg(mainDB));
            }

            selectSQL = @"insert into main.meals select * from old_db.meals";
            if (sqlite3_prepare_v2(mainDB, [selectSQL UTF8String] , -1, &selectStmt, nil) == SQLITE_OK) {
                while (sqlite3_step(selectStmt) == SQLITE_ROW) {
                    //do something
                }
            }
            else {
                NSLog(@"Error while creating select statement: '%s'", sqlite3_errmsg(mainDB));
            }

            selectSQL = @"insert or ignore into main.usda select * from old_db.usda";
            if (sqlite3_prepare_v2(mainDB, [selectSQL UTF8String] , -1, &selectStmt, nil) == SQLITE_OK) {
                while (sqlite3_step(selectStmt) == SQLITE_ROW) {
                    //do something
                }
            }
            else {
                NSLog(@"Error while creating select statement: '%s'", sqlite3_errmsg(mainDB));
            }
        }
        else {
            NSLog(@"Error while attaching databases: '%s'", errorMessage);
        }
    }
    else {
        NSLog(@"Failed to open database at %@ with error %s", mainDBPath, sqlite3_errmsg(mainDB));
        sqlite3_close(mainDB);
    }
}