вопрос путей базы данных iphone sqlite - PullRequest
1 голос
/ 10 ноября 2009

Я поддерживаю sqlite db в своем приложении для iPhone, поэтому мне было интересно, как можно сохранить одну версию и обновить ее.

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

на моем симуляторе iPhone папка с документами меняется как каждый раз, когда я открываю приложение

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

Моя проблема в том, что иногда я делаю изменения и загружаю приложение снова, чтобы обнаружить, что изменения пропали!

все, что я сделал:

  1. создал базу данных с использованием терминала по определенному пути и в папке ресурсов в xcode щелкнул правой кнопкой мыши и добавил существующий файл
  2. я делаю это каждый раз, когда загружаю приложение:
-(void)DBinit
{
    // Setup some globals
    databaseName = @"articlesdb.sql";

    // Get the path to the documents directory and append the databaseName
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] copy];
    NSLog(databasePath);
    // Execute the "checkAndCreateDatabase" function
    [self checkAndCreateDatabase];  
}

-(void)checkAndCreateDatabase
{
    // Check if the SQL database has already been saved to the users phone, if not then copy it over
    BOOL success;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    success = [fileManager fileExistsAtPath:databasePath];

    // If the database already exists then return without doing anything
    if(success) 
    {
        [fileManager removeItemAtPath:databasePath error:nil];
        return;
    }

    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

    fileManager release];
}

1 Ответ

1 голос
/ 10 ноября 2009

Xcode вместе с iPhone Simulator создает новую папку приложения для каждой сборки вашего приложения и перемещает папку старых документов и ее содержимое в новую папку приложения. Вы должны проверить содержимое папки с документами и решить, является ли файл, который есть в вашем пакете, более предпочтительным, чем тот, который находится в папке с документами. Вы должны принять это решение разумно, а не легко.

Это правильное поведение. Пользователь вашего программного обеспечения, возможно, внес некоторые существенные изменения и модификации в базу данных. Им, вероятно, не понравится, если при обновлении для незначительного исправления ошибки или даже для улучшения функций их базы данных, их высокие оценки, их измененные изображения или все, что сохраняет ваше приложение, внезапно заменяют универсальной версией.

Что вам нужно сделать, это сравнить данные в вашей новой базе данных с данными, которые есть у пользователя, а в случае SQLite вы должны импортировать или скопировать запись пользователя в вашу новую базу данных, а затем вы можете переместить вашу новая база данных переместится в папку документов, удалив пользователя, но заменив ее базой данных, содержащей данные пользователя и ваши новые данные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...