новичок в sqlite3, наконец, иди сюда после того, как попробовал тысячи способов ее решить - PullRequest
1 голос
/ 10 января 2012

Я новичок в Xcode и пытаюсь учиться сам, моя проблема может быть наивной, но мне действительно нужна помощь. Я учусь создавать электронную книгу, изучая готовый проект с исходным кодом. Отлично работает с записью закладок через sqlite3. Но когда я создаю новый проект с другим именем и путем, правильно строю часть libsqlite3.dylib и копирую почти весь код, вызывается оператор else, который вылетает при попытке открыть окно закладок.

Вот несколько вопросов, которые я сам себе задал,

  1. я что-то пропустил или не смог изменить имена или пути? ответил: нет.
  2. , так как один работает отлично, а другой с почти таким же кодом вылетает, какая ошибка наиболее вероятна? ответил: очень мало отличий от этих двух проектов, и т.д. путь, имя, содержимое в файле.

Затем я изменил имя файла базы данных хорошего проекта, и он стал сбой. Я не мог поверить, потому что я слышал, что sqlite3_open([dbPath UTF8String], &dataBase); создаст файл, если он не существует, почему он просто не создаст новый файл с новым именем после того, как ему будет сказано получить доступ к новому файлу?

Второй тест, который я провел, - это изменение пути к файлу db нового проекта вручную на путь к файлу db исходного. как путь больше не [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];, но это @ "/ Users / ~ (путь к оригиналу) ~ / Documents / archive" и, боже, это работает. Но, конечно, я не могу оставить это так, потому что этот путь ничего не значит на реальном iPhone, и он все еще зависит от файла базы данных исходного.

По крайней мере, я знаю, что путь действительно имеет значение, и мне кажется, что мне не хватает чего-то вроде файла db в моем новом проекте. Но дело в том, что я не нашел ни одного файла БД в пути исходного проекта, он, кажется, существует и важен, но не отображается в поиске.

Я даже попытался программно скопировать файл в мой новый путь, например, вызвав [self createEditableCopyOfDatabaseIfNeeded]; с новым и старым путем. Это все, что я пробовал до сих пор.

Странно то, что он каким-то образом записывает шрифт и цвет после неизвестной попытки, но все равно вылетает при переходе в окно закладок.

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

const char * createSQL = "СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ ЗАКЛАДКА (pos REAL PRIMARY KEY, \ fontsize REAL, \ bookpath TEXT)";

недавно добавлено: поскольку программа автоматически выдает сбой, когда база данных не подготовлена, ошибка meg, как кто-то сказал, бесполезна. Все, что мне нужно, это, возможно, сделать sqlite3_prepare(dataBase, [querySQL UTF8String], -1, &statement, nil) == SQLITE_OK не ложным ..

Ответы [ 2 ]

0 голосов
/ 11 января 2012

SQL, который вы используете для создания таблицы в новой БД, кажется, запутался. Попробуйте удалить \ 's

Попробуйте вместо этого:

const char *createSQL = "CREATE TABLE IF NOT EXISTS BOOKMARK(pos REAL PRIMARY KEY, fontsize REAL, bookpath TEXT)";

Кроме того, вы должны взглянуть на то, что на самом деле возвращает sqlite3_prepare. Документация по SQLite содержит список кодов ошибок для проверки. Пример регистрации кода ошибки:

int ret = sqlite3_prepare(dataBase, [querySQL UTF8String], -1, &statement, nil);
if (ret != SQLITE_OK) {
    NSLog(@"Error calling sqlite3_prepare: %d", ret);
}
0 голосов
/ 11 января 2012

Почему бы вам не распечатать значение, записанное в errorMsg? По крайней мере, это скажет вам, почему вы не создаете базу данных.

NSLog (@ "% @", [NSString stringWithUTF8String: errorMsg]);

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