iOS Sqlite3 SQLITE_ERROR

У меня есть функция в приложении iOS, которое читает в некоторых данных из базы данных. Функция чрезвычайно проста:

-(void) readCategories { sqlite3 *database; if([[NSFileManager defaultManager] fileExistsAtPath:databasePath]){ if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { const char *sqlStatement = "SELECT * FROM Categories ORDER BY name COLLATE NOCASE ASC"; sqlite3_stmt *compiledStatement; int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL); if(errorCode == SQLITE_OK) { while(sqlite3_step(compiledStatement) == SQLITE_ROW) { [categories addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]]; } } else { NSLog(@"Error reading categories. Code: %d, message: '%s'", errorCode,sqlite3_errmsg(database)); } sqlite3_finalize(compiledStatement); sqlite3_close(database); } else { NSLog(@"Error opening DB"); } } else { NSLog(@"DB does not exist."); } } 

Проблема в том, что errorCode всегда является SQLITE_ERROR, который согласно документации: «Ошибка SQL или отсутствующая база данных». Приведенное сообщение: «нет такой таблицы: Категории»

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

Кто-нибудь есть идеи о том, что происходит не так?

Благодарю.

2 Solutions collect form web for “iOS Sqlite3 SQLITE_ERROR”

Если вы когда-либо запускали этот код перед добавлением [[NSFileManager defaultManager] fileExistsAtPath:databasePath] , стандартный sqlite3_open создаст для вас пустую базу данных, если он ее не найдет. Так,

  1. Сбросьте свой симулятор через «Сбросить содержимое и настройки …» в меню Симулятора. Это позволит устранить любые посторонние файлы базы данных, которые, возможно, были созданы в прошлом. (Если вы делаете это на устройстве, удалите приложение и переустановите его.)

  2. Команда sqlite3_open создаст пустую базу данных, если она не найдена. Чтобы быть в безопасности, в будущем вместо этого используйте sqlite3_open_v2 , который никогда не создаст пустую базу данных:

     if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { // handle opening error here } 

    Используя sqlite3_open_v2 , он гарантирует, что база данных никогда не будет создана во время открытого процесса.

  3. Если у вас по-прежнему возникают проблемы, перейдите в каталог вашего симулятора на вашем компьютере, а именно «~ / Library / Application Support / iPhone Simulator». (Возможно, вам придется отобразить папку «Библиотека», введя следующую команду в окне терминала:

     chflags nohidden ~/Library 

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

  4. Если после выполнения всего этого вы не видите, что ваша база данных скопирована на ваш симулятор / устройство, убедитесь, что вы установили параметры сборки фаз вашей цели, чтобы база данных включалась через «Copy Bundle Resources».

  5. Как было предложено другими, всякий раз, когда вы получаете SQLITE_ERROR , всегда проверяйте данные об ошибках через нечто вроде NSLog(@"%s SQLITE_ERROR '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database)); ,

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

  • Доля Sqlite с обменом файлами iTune в приложении iOS.
  • Не удалось создать базу данных SQLite3 с защитой файлов в iOS
  • sqlite 3 "Ошибка SQL" из памяти "(7)" objc
  • Создание файла базы данных SQLite3 через Objective-C
  • iPhone iOS: SQLite3 Не удалось получить последнее значение ID в таблице
  • Какая версия sqlite предоставляет iOS?
  • Swift Framework - Как импортировать sqlite3.h в файл зонтика
  • Sqlite в проблемах памяти iOS
  • Открытие и создание базы данных SQLite в Objective C
  • Ошибка sqlite make statement - нет такой таблицы
  • Вопрос о SQLite3 и обновлении приложения для iPhone
  • Interesting Posts

    Воспроизведение MPMoviePlayerController синхронно с AVAudioPlayer

    locationManager: didFailWithError: не вызывается, если пользовательские службы местоположения отключены

    Попытка установить объект не-property-list

    Инструмент VM tracker пуст

    Вызовите URL-адрес для приложения iOS?

    Кнопка iOS UIAlertView, чтобы перейти в настройку приложения

    Память CollectionView VM: выделенная и оставленная память CoreAnimation

    Допустимые способы освобождения имущества

    iOS – NSArray indexOfObject не вызывает настроенный isEqual

    Произошла ошибка при загрузке в iTunes Store

    Цель C – получить следующий день с сегодняшнего дня (завтра)

    Интерактивный просмотр контроллера увольнения и изменения статусаBarStyle несовместим?

    supportedInterfaceOrientations, вызываемый для всех iPhone, кроме 6+

    UITapGestureRecognizer в SKNode: преобразование координат из UIView в SKNode

    Отправка и получение приглашения с использованием протокола Multipeer

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.