Каков наилучший способ записи ранее созданной базы данных Sqlite в документы в iOS - PullRequest
0 голосов
/ 25 октября 2011

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

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

Нет ли способа просто записать базу данных во внутреннее хранилище и затем манипулировать ею с этого момента?

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

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

Вот пример кода из моего примера проекта, который делает это.В моем примере это база данных контактов.Обратите внимание, как surePrepared скопирует его из пакета, если он не существует.Я копирую в путь к библиотеке, но вы можете скопировать в путь к документам.

- (BOOL)ensureDatabaseOpen: (NSError **)error
{
    // already created db connection
    if (_contactDb != nil)
    {
        return YES;
    }

    NSLog(@">> ContactManager::ensureDatabaseOpen");    
    if (![self ensureDatabasePrepared:error])
    {
        return NO;
    }

    const char *dbpath = [_dbPath UTF8String]; 
    if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK &&
        error != nil)
    {
        *error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease];
        return NO;
    }

    NSLog(@"opened");

    return YES;
}

- (BOOL)ensureDatabasePrepared: (NSError **)error
{
    // already prepared
    if ((_dbPath != nil) &&
        ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
    {
        return YES;
    }

    // db in main bundle - cant edit.  copy to library if !exist
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
    NSLog(@"%@", dbTemplatePath);

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];

    NSLog(@"dbPath: %@", _dbPath);

    // copy db from template to library
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
    {
        NSLog(@"db not exists");
        NSError *error = nil;
        if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
        {
            return NO;
        }

        NSLog(@"copied");
    }    

    return YES;    
}
2 голосов
/ 25 октября 2011

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

Взгляните на Где бы вы разместили файл базы данных SQLite в приложении для iPhone?

2 голосов
/ 25 октября 2011

Хранить базу данных в комплекте (в проекте). В приложении «Делегат» скопируйте базу данных в каталог «Документы» (делайте это только в том случае, если файл базы данных еще не существует в каталоге документов, в противном случае файл всегда будет перезаписываться). В вашем коде всегда указывайте копию в каталоге документа.
Также прочитайте этот ТАК вопрос для некоторого кода о том, как сделать копию.

Вуаля.

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