Локальная база данных приложения будет такой же на обновленной версии приложения - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть одно приложение в магазине приложений. Он имеет локальную базу данных, где пользователь хранит некоторую информацию. Сейчас я планирую выпустить вторую версию приложения. У меня вопрос, будут ли данные, введенные пользователем в первой версии приложения, доступны во второй версии или они будут пустыми.

Заранее спасибо.

1 Ответ

0 голосов
/ 04 ноября 2011

Вам нужно будет протестировать предыдущую версию в коде и программно объединить их.

Примерно так:

- (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);
    }
}
...