Где бы вы разместили файл базы данных SQLite в приложении для iPhone? - PullRequest
33 голосов
/ 04 апреля 2009

Когда я первоначально создаю файл базы данных SQLite с предварительно вставленными наборами данных для своего приложения, мне нужно будет поместить этот файл где-нибудь в моем проекте XCode, чтобы он перешел в мое приложение для iPhone. Я думаю, что "ресурсы" - правильное место для этого.

Каковы основные "шаги" для развертывания файла базы данных SQLite в приложении iPhone?

  • создание базы данных вручную
  • добавление файла базы данных в проект (где?)

Я сейчас читаю всю документацию по SQLite, хотя это не сильно связано с iPhone.

Ответы [ 2 ]

71 голосов
/ 04 апреля 2009

Сначала необходимо добавить файл SQLite в проект Xcode - наиболее подходящее место - в папке ресурсов.

Затем в файле кода делегата приложения в методе appDidFinishLaunching сначала необходимо проверить, была ли уже создана доступная для записи копия файла SQLite, т.е. была ли создана копия файла SQLite в документе пользователя папка в файловой системе iPhone. Если да, вы ничего не делаете (в противном случае вы перезаписали бы его копией XCode по умолчанию SQLite)

Если нет, то вы копируете туда файл SQLite, чтобы сделать его доступным для записи.

См. Приведенный ниже пример кода, чтобы сделать это: это было взято из примера кода Apple SQLite, где этот метод вызывается из метода делегатов приложения appDidFinishLaunching.

// Creates a writable copy of the bundled default database in the application Documents directory.
- (void)createEditableCopyOfDatabaseIfNeeded {
    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bookdb.sql"];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success)
        return;
    // The writable database does not exist, so copy the default to the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"bookdb.sql"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

============

Вот приведенный выше код в Swift 2.0 +

// Creates a writable copy of the bundled default database in the application Documents directory.
private func createEditableCopyOfDatabaseIfNeeded() -> Void
{
    // First, test for existence.
    let fileManager: NSFileManager = NSFileManager.defaultManager();
    let paths:NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let documentsDirectory:NSString = paths.objectAtIndex(0) as! NSString;
    let writableDBPath:String = documentsDirectory.stringByAppendingPathComponent("bookdb.sql");

    if (fileManager.fileExistsAtPath(writableDBPath) == true)
    {
        return
    }
    else // The writable database does not exist, so copy the default to the appropriate location.
    {
        let defaultDBPath = NSBundle.mainBundle().pathForResource("bookdb", ofType: "sql")!

        do
        {
            try fileManager.copyItemAtPath(defaultDBPath, toPath: writableDBPath)
        }
        catch let unknownError
        {
            print("Failed to create writable database file with unknown error: \(unknownError)")
        }
    }
}
6 голосов
/ 05 апреля 2009

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

Это, однако, вероятно, не очень хорошая практика. Если бы в будущем вы расширили свое приложение, чтобы разрешить запись в базу данных, вам пришлось бы все выяснить снова ...

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