вопрос создания базы данных sqlite - PullRequest
1 голос
/ 24 февраля 2011

Я учу себя цель-c и в настоящее время пытаюсь понять, как интегрировать базу данных в мое приложение.Я просмотрел множество примеров, форумов и учебных пособий, но ни один из них не сработал, что я делаю не так?

  1. Большинство примеров поставляется с базой данных [projectName] .sqlite в приложении.Как это добавляется?Не видно ни одного объяснения того, как это заканчивается в проекте.

  2. Я создал мою объектную модель и классы.Я запускаю метод, который проверяет, существует ли БД, если нет, то создает БД.Я нашел несколько примеров, где используются разные пути, и я не уверен, что это правильно. Некоторые примеры скопировали часть файлов моего проекта в папку documents / mainDatabase.sqlite!Правильно ли следующее, если да, то почему я получаю ошибку?

* Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Не удалось создать файл базы данных с возможностью записи с сообщением» Операция не может быть завершена.Нет такого файла или каталога '.

Использование этих причин вызывает вышеуказанную ошибку, и да, defaultDBPath существует

defaultDBPath: / Users / myuser / Библиотека / Поддержка приложений / iPhone Simulator / 4.2 / Applications/ DFBAD921-CEBF-471E-B98B-04FDF2620146 / Документы

defaultDBPath: / Пользователи / myuser / Библиотека / Поддержка приложений / iPhone Simulator / 4.2 / Приложения / DFBAD921-CEBF-471E-B98B-04FDF2620146 / Документы / mainDatabase.sqlite

writableDBPath: / Users / myuser / Библиотека / Поддержка приложений / iPhone Simulator / 4.2 / Приложения / DFBAD921-CEBF-471E-B98B-04FDF2620146 / dbProj12.app / mainDatabase.sqlit

- (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];
NSLog(@"documentDirectory = %@", documentDirectory);
NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"iBountyHunter.sqlite"];

NSLog(@"defaultDBPath = %@", writableDBPath);
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:@"iBountyHunter.sqlite"];

    NSLog(@"defaultDBPath = %@", defaultDBPath);
    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]);
    }
}

}

С нетерпением ждем вашего ответа.

Ответы [ 3 ]

1 голос
/ 28 марта 2014

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

Ответ связан с «целевым членством».

  • нажмите на файл sql в левой панели Xcode

  • В разделе "Целевое членство" убедитесь, что "чек" "проверен" для вашей целевой сборки.

Вот и все, это решает мою проблему. Надеюсь, это поможет и вам.

1 голос
/ 27 февраля 2011

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

В сообщении говорилось, что iBountyHunter.sqlite не существует, и это истинное сообщение: этот db следует добавить в проект XCode и упаковать при сборке приложения.

Некоторые приложения поставляются с уже заполненной базой данных, которая, вероятно, была изменена разработчиком на Mac, основываясь на том, что создано в симуляторе (или даже в устройстве разработки).

  1. Сборка и запуск приложения на симуляторе;
  2. Найдите в папке «Документы» на вашем устройстве и скопируйте базу данных;
  3. Отредактируйте его, добавив пользовательские данные;
  4. Добавить базу данных в XCode;
  5. Добавьте код, который вы сообщили;
  6. Создайте и дайте приложению скопировать заполненную базу данных на устройство.
0 голосов
/ 17 октября 2011

Mac подмечает, вы используете sqlite или основные данные?

Если вы используете sqlite, то при запуске приложения проще всего скопировать его в директоры документов приложений (есликонечно, он уже существует, и в этом случае ничего не делать)

Я обычно создаю sqliteDB, внешний по отношению к xcode, и добавляю его в виде файла (как изображение).Затем в методе applicationDidFinishLaunchingWithOptions (в вашем делегате приложения я вызываю тот же метод, но мой код немного отличается. Взгляните:

- (void)createEditableCopyOfDatabaseIfNeeded 
{
    //We always need to overwrite the DB, but first we need to extract usedQuestionIds, ObjectiveData and stats

    //Once database is replaced, reinsert data

    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"yourdatabasename.sqlite"];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success)
    {
        //might want to check for update and if so, back up users unique data, replace database and reinsert
    }
    else
    {
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"yourdatabasename.sqlite"];
        [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    }

Затем в моем делегате приложения создается другой метод, который позволяетмне, чтобы получить соединение БД, которое я могу затем использовать:

+(sqlite3 *)getNewDBConnection
{
    sqlite3 *newDBconnection;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yoursqliteDatabaseName.sqlite"];
    // Open the database. The database was prepared outside the application.
    if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) 
    {

        NSLog(@"Database opened successfully");

    } 
    else 
    {
        NSLog(@"Error in opening database  ");
    }

    return newDBconnection; 

}

Теперь, где бы вы ни находились в вашем приложении, вы можете подключиться к БД, позвонив по телефону:

sqlite3 *db = [YourAppDelegateName getNewDBConnection];

//do stuff with your sqlite db connection

sqlite3_close(db);

Надеюсь, это поможет:)

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