|
|
|||||
SQLite - не могу подключить к Air
Создана база данных, делаю все как в примере
Создал простейшую базу данных для эксперимента. import flash.data.SQLConnection; // Необходима для соединения с файлом базы данных (БД) import flash.data.SQLStatement; // Необходима для работы с запросами import flash.data.SQLResult; // Необходима для обработки результатов запроса import flash.data.SQLMode; // Нам не понадобится, а используется для пояснения, для чего мы открываем БД (чтения, записи или обновления) import flash.events.SQLErrorEvent; // Обрабатывает ошибки подсоединения к БД import flash.events.SQLEvent; // Обрабатывает остальные события БД (OPEN, UPDATE и т.д.) import flash.filesystem.File; // Необходима для указания пути к файлу БД private var conn:SQLConnection; private var createStmt:SQLStatement; private var insertStmt:SQLStatement; private var insertStmt2:SQLStatement; private var selectStmt:SQLStatement; protected function init(event:FlexEvent):void { var dbFile:File = File.applicationStorageDirectory.resolvePath("ccc.sqlite"); conn = new SQLConnection(); conn.openAsync(dbFile); conn.addEventListener(SQLEvent.OPEN, openSuccess); conn.addEventListener(SQLErrorEvent.ERROR, openFailure); } protected function openSuccess(event:SQLEvent):void { conn.removeEventListener(SQLEvent.OPEN, openSuccess); conn.removeEventListener(SQLErrorEvent.ERROR, openFailure); trace ("openSuccess"); selectStmt = new SQLStatement(); selectStmt.sqlConnection = conn; var sql:String = "SELECT * FROM nnn WHERE id = 2"; selectStmt.text = sql; selectStmt.addEventListener(SQLEvent.RESULT, selectResult); selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError); selectStmt.execute(); } protected function openFailure(event:SQLErrorEvent):void { conn.removeEventListener(SQLEvent.OPEN, openSuccess); conn.removeEventListener(SQLErrorEvent.ERROR, openFailure); trace ("openFailure"); } protected function selectResult(event:SQLEvent):void { selectStmt.removeEventListener(SQLEvent.RESULT, selectResult); selectStmt.removeEventListener(SQLErrorEvent.ERROR, selectError); trace ("selectResult"); var result:SQLResult = selectStmt.getResult(); } protected function selectError(event:SQLErrorEvent):void { selectStmt.removeEventListener(SQLEvent.RESULT, selectResult); selectStmt.removeEventListener(SQLErrorEvent.ERROR, selectError); trace ("selectError"); } openSuccess selectError Скажите, плиз, откуда взяться ошибке? Добавлено через 1 час 44 минуты Да, собственно ошибка: selectError SQLError: 'Error #3115: SQL Error.', details:'no such table: 'nnn'', operation:'execute', detailID:'2013' Но эта таблица в базе данных есть. Перепробовал несколько готовых файлов баз, создавал свои простейшие - ошибка со всеми одна и та же(( |
|
|||||
Если таблица есть - заключать её в тильды. Так же заключать в тильды названия полей:
Если у поля проверяется строковое значение - то запрос выполнять так: Тобишь одинарные кавычки в строковом условии обязательны. Или вывалится sqlerror. Кстати, очень хочу написать серию статей по SQLITE в AIR. Будет кому интересно - начну писать.
__________________
Кодинг, багинг, алгоритминг. me @ Последний раз редактировалось DaFive; 07.07.2011 в 13:00. |
|
|||||
Тогда другой вопрос. Точно ли база ccc.sqlite лежит в applicationStorageDirectory с теми таблицами, которые ты создавал? Потому что в случае с ошибкой в путях - эйр создаст пустую базу ccc.sqlite.
Или выполни запрос после коннекта: После запроса сделай SELECT. Или попробуй создай базу, скажем в userDirectory/test/ вручную, через sqlite expert personal (советую скачать, бесплатна и очень помогает). Да, и поскольку коннект к базе асинхронный - дожидайся завершения 1 запроса по евенту, а потом запускай следующий. А вообще - лучше сделай для начала синхронный коннект к базе.
__________________
Кодинг, багинг, алгоритминг. me @ Последний раз редактировалось DaFive; 07.07.2011 в 13:36. Причина: апд |
|
|||||
Цитата:
Цитата:
Цитата:
Цитата:
Добавлено через 1 минуту Я смотрю проблема не только у меня. Поиск в гуле выдает, что проблема у многих, но самое интересное, что нигде нет решения. |
|
|||||
Цитата:
Проверь существование файла через File.applicationStorageDirectory.resolvePath("ccc.sqlite").exists. И я не уверен что applicationStorageDirectory - это bin-debug. В Винде, она вроде как в юзерской папке находится. Добавлено через 8 минут Ну да, так и есть: http://blog.usu.edu/flexing/2008/09/...oss-platforms/
__________________
Кодинг, багинг, алгоритминг. me @ |
|
|||||
Ну так у меня bin-debug и находится в юзерской папке
Что-то вообще непредсказуемые результаты выдает. Теперь с таблицей все нормально, столбец не может найти. При этом меняю в коде название таблицы на несуществующее в БД - все нормально, по прежнему не находим столбец. Через какое-то время наконец-то обнаруживает, что таблица не существует. Никакой логики... Добавлено через 3 минуты Да и вообще, как приложение может не найти путь к базе данных, если у меня слушатель открывает openSuccess только в случае успешного соединения к базе? А это всегда успешно происходит. Добавлено через 7 минут Может Air как-то кэширует базы данных? |
|
|||||
Да не кеширует. Оно всегда будет успешно отрабатывать коннект, потому что нет проверки на существование файла. Оно его создаст или приконнектится к существующему, в случае если файл не создан. Приложение не сможет создать БД в случае, если путь будет в папку, доступ к которой запрещен. Тогда и вывалится ошибка.
Протрейсить можно еще путь: File.applicationStorageDirectory.nativePath. Что выведет?
__________________
Кодинг, багинг, алгоритминг. me @ |
Часовой пояс GMT +4, время: 00:12. |
|
« Предыдущая тема | Следующая тема » |
|
|