обновить SQLITE3 (базовые данные) на устройстве и в магазине приложений - PullRequest
2 голосов
/ 06 июня 2011

У меня есть приложение, использующее Core Data SQLITE3, которое отлично работает в симуляторе.Однако я не понимаю, как обновить БД на устройстве, которое, я думаю, такое же, как в магазине приложений.

Я обновляю БД из .txt файлов в приложении и создаю БД, эта функция предназначена только для создания БД и будет удалена в окончательной версии.Моя идея состоит в том, чтобы создать БД в симуляторе, заблокировать часть обновления кода и затем распространить пакет с обновленной базой данных.

Однако, когда я перестраиваю свое приложение на устройстве, оно все еще содержит старые данныев БД.

Я искал вокруг, но боюсь, я не до конца понимаю, как решить эту проблему.Я нашел эту ветку: Не могу обновить базу данных iphone sqlite3

Я был бы очень признателен, если бы какой-нибудь приятный человек поделился этим и помог мне решить эту проблему.

Приветствия

Ответы [ 2 ]

0 голосов
/ 06 июня 2011

На самом деле использовать файл .db внутри Bundle - это очень плохая идея. Каждый раз, когда я использую файл .db, я проверяю, существует ли он уже внутри моего каталога документов приложения, и затем я перезаписываю его.

    #define DB_SHOULD_BE_REWRITTEN YES //You should update database and change allready existing db file to file from bundle
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];


    BOOL success = [fileManager fileExistsAtPath:writableDBPath];

    if (!success || DB_SHOULD_BE_REWRITTEN)
    {
        // The writable database does not exist, so copy the default to the appropriate location.
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        if (!success) {
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
        }
    }

    dbPath = writableDBPath;
0 голосов
/ 06 июня 2011

Вы скопировали файл db из каталога комплекта (который только для чтения) в доступный для записи?(как каталог документов каждого приложения?).

При попытке сохранить в устройстве вы получили ошибку sqlite, подобную этой?

SQLITE_READONLY     8   /* Attempt to write a readonly database */

РЕДАКТИРОВАТЬ:

Все файлы в основном комплекте доступны только для чтения,поэтому, если вам нужно изменить один / несколько из них, вам необходимо скопировать файлы в место, доступное для записи.Предполагая, что вы вызвали db mydb.sqlite, здесь есть некоторый код, который копирует db (только если он не существует) в каталог документов.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    NSFileManager *fm = [NSFileManager defaultManager];
    NSString *docPath = [docDirectory stringByAppendingPathComponent:@"mydb.sqlite"];
    if (![fm fileExistsAtPath:docPath]) { // file does not exists, copy it
        NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"mydb" ofType:@"sqlite"];
        NSError *error = nil;
        BOOL res = [fm copyItemAtPath:bundlePath toPath:docPath error:&error];
        if (!res) {
            // do something with error
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...