Локальная база данных приложения будет такой же в обновленной версии приложения.

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

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


person Satish    schedule 04.11.2011    source источник


Ответы (1)


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

Что-то вроде этого:

- (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);
    }
}
person james_womack    schedule 04.11.2011
comment
Спасибо за ценный комментарий... :) - person Satish; 05.11.2011
comment
@Сатиш, пожалуйста. Если он ответил на ваш вопрос, пожалуйста, выберите его в качестве ответа. - person james_womack; 06.11.2011
comment
да, я сделаю это, как только реализую это .. Я все еще не мог найти способ определить версию приложения, если бы вы сообщили мне и об этой части, это было бы здорово. Спасибо... - person Satish; 08.11.2011
comment
NSString * version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@CFBundleVersion]; - person james_womack; 08.11.2011
comment
Спасибо за комментарий .. Я сделал одно упражнение, в котором я установил приложение, а затем ввел его значение в базу данных. а затем я изменил версию приложения и установил его снова, это не изменило значение, которое я ввел в предыдущей версии приложения.. означает ли это, что оно автоматически сохраняет локальную базу данных предыдущей версии приложения. я не копировал базу данных старой версии в новую, я просто проверил условие существования базы данных.. - person Satish; 09.11.2011
comment
Да, он сохраняет все в папке документов пользователя во время обновления - person james_womack; 09.11.2011