Подтвердить что ты не робот

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

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

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

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

В настоящее время я читаю всю документацию по SQLite, хотя это немного связано с iPhone.

4b9b3361

Ответ 1

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

Затем в файле кода делегата приложения в методе appDidFinishLaunching вам нужно сначала проверить, была ли уже создана записываемая копия SQLite файла, т.е. в файле пользователя была создана копия файла SQLite папку в файловой системе iPhone. Если да, вы ничего не делаете (иначе вы бы перезаписали его с помощью копии Xite 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)")
        }
    }
}

Ответ 2

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

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