Загрузка данных ядра iPhone с загруженного sqlite - PullRequest
0 голосов
/ 24 июня 2010

Я хочу представить возможность для моего приложения основных данных загружать НОВЫЙ файл sqlite и обновлять его сохраненные данные. Обратите внимание, что модель данных не меняется.

Сначала я не беспокоюсь о пользовательских изменениях хранимых данных, а просто хочу перезаписать их.

  • Я считаю, что единственный способ обновления хранимых данных - это изменить имя файла sqlite ..?
  • Существует ли стандартный способ объединения двух файлов sqlite через core-data? Таким образом, сохраняя измененные пользователем данные.
  • Может ли обновление (загруженный файл sqlite) быть подмножеством отправленных данных ядра sqlite? Обратите внимание, что sqlite содержит двоичную информацию.

Я думаю этот ТАК вопрос не дает ответов на эти вопросы.

Спасибо за любые рекомендации!

Ответы [ 2 ]

0 голосов
/ 25 ноября 2010

Я знаю, что это старый вопрос, но после этого я просто хотел добавить следующие пункты:

  • Файл sqlite по умолчанию для основного хранилища данных, yourProjectName.sqlite, кажется,быть защищенным.Перезапись это не работает.Вам нужно будет сделать то, что было предложено выше в raaz, и создать копию.
  • После создания копии вы можете легко перезаписать файл.Однако некоторые предложения в других ответах показывают, что лучший способ перезаписать файл sqlite базовых данных - это сначала удалить его.Это не работает на устройстве!Выдает ошибку о том, что не может удалить файл.Он работает в симуляторе, но не на устройстве (протестировано на 3G на 4.2)
  • Поэтому лучший способ - просто перезаписать файл, а не удалять его и создавать новый.
  • И, конечно, сначала обязательно удалите хранилище из координатора постоянного хранилища!

Мой 2с, надеюсь, это кому-нибудь поможет.

0 голосов
/ 24 июня 2010

Если вы хотите обновить какой-либо файл базы данных без изменения существующей базы данных, то вам нужно реализовать это

- (void)applicationDidFinishLaunching:(UIApplication *)application {

[self createEditableCopyOfDatabaseIfNeeded];

}

- (void)createEditableCopyOfDatabaseIfNeeded {

    // First, test for existence - we don't want to wipe out a user's DB

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *documentDirectory = [self applicationDocumentsDirectory];

    NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"DataBaseName.sqlite"];

    BOOL dbexits = [fileManager fileExistsAtPath:writableDBPath];

    if (!dbexits) {

        // The writable database does not exist, so copy the default to the appropriate location.
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"DataBaseName.sqlite"];

        NSError *error;
        BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        if (!success) {

            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);

        }

    }

}
...