База данных Sqlite возвращает 8 при развертывании в ipad - PullRequest
0 голосов
/ 23 декабря 2010

Моя проблема появляется в устройстве, но не в симуляторе.

nDBres=sqlite3_prepare_v2(databaseConn, sqlStatement, -1, &compiledStatement,NULL)

Это запрос на вставку, который я пытаюсь выполнить.В симуляторе он возвращает 0, тогда как в устройстве он возвращает 8. После этого всякий раз, когда я пытаюсь запустить любую другую операцию записи, приложение вылетает.

Я схожу с ума по этому.

1 Ответ

6 голосов
/ 23 декабря 2010

Вы можете ознакомиться со списком кодов ошибок sqlite3 как часть документации API sqlite3 (http://www.sqlite.org/c3ref/c_abort.html. Код ошибки 8: SQLITE_READONLY («Попытка записи базы данных только для чтения»).

Как вы, вероятно, знаете, приложения для песочницы iOS работают на устройстве, поэтому вы должны обязательно создать базу данных в одной из областей, которые ОС предоставляет для создания файлов, доступных для записи приложения.

Есть достойное руководство по настройке проекта sqlite3 на iOS http://icodeblog.com/2008/08/19/iphone-programming-tutorial-creating-a-todo-list-using-sqlite-part-1/.

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

(Обратите внимание, это не мой код ... Я воспроизводлю его из учебника на icodeblog.com, где подробно объясняется)

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    [self createEditableCopyOfDatabaseIfNeeded];
    [self initializeDatabase];

    // Configure and show the window
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
}

// 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:@"todo.sqlite"];
    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:@"todo.sqlite"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...