Запрос к базе данных SQLite с помощью приложения Flex / AIR - PullRequest
1 голос
/ 13 декабря 2010

Я пытался установить интерфейс SQLite и Adobe AIR. Я использую Flex 4 SDK с AIR 2.0. Я изменил код из учебника Дэвида Такера на InsideRIA (http://insideria.com/2008/04/air-api-additional-query-tech.html). Я пишу в FlashDevelop (что, я полагаю, может быть моей проблемой), и я могу скомпилировать и запустить приложение. Проблема в том, что когда я иду в Поиск в файле базы данных, я всегда получаю какую-то ошибку, которая приводит к трассировке «BREAKER» (то есть - вызывается функция «queryError»). Я попытался просто запустить команду SQL на базе данных, и она работает нормально, поэтому есть проблема в том, как Flex или AIR обрабатывает мой запрос (или, очевидно, я мог ошибиться в кодировании). Спасибо всем, кто сможет помочь. Мой код выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
  xmlns:TestSQL="*"
  xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/mx"
  xmlns:fl="http://code.google.com/p/flexlib/"
  xmlns:views="com.views.*"
  layout="absolute" 
  showFlexChrome="false"
  showStatusBar="false"
  creationComplete="init()">
  <!-- xmlns:com="components.*" -->

  <fx:Script>
  <![CDATA[
        import flash.data.SQLStatement;
        import flash.errors.SQLError;
        import flash.events.Event;
        import flash.events.SQLErrorEvent;
        import flash.events.SQLEvent;
        import flash.events.TimerEvent;
        import flash.filesystem.File;
        import flash.utils.Timer;

        // -- PROPERTIES ------------------------------------------------------------- /

        private var dbFile:File;
        private var conn:SQLConnection;

        // -- AUTO INIT FUNCTIONS --------------------------------------------------- /

        private function init():void {

            // Create a File Reference to the Included DB
            dbFile = File.applicationDirectory.resolvePath( "contacts.db" );

            // Create SQL Connection
            conn = new SQLConnection();
            conn.openAsync( dbFile );

        }

        private function callQuery():void {
            var q:SQLStatement = new SQLStatement();
            q.sqlConnection = conn;
            q.addEventListener( SQLEvent.RESULT, queryResult );
            q.addEventListener( SQLErrorEvent.ERROR, queryError );

            var sql:String = "SELECT DISTINCT contacts.lastName, contacts.firstName, contacts.email " +
                    "FROM contacts " +
                    "WHERE lastName LIKE :searchString " + 
                    "OR firstName LIKE :searchString";

            q.parameters[":searchString"] = "%" + searchString.text + "%";
            q.text = sql;
            q.execute();
        }

        private function queryResult( event:SQLEvent ):void {
            var r:SQLResult = SQLStatement(event.currentTarget).getResult();
            dg.dataProvider = r.data;
        }

        private function queryError( event:SQLErrorEvent ):void {
            trace("BREAKER");
        }

]]>
</fx:Script>

<mx:VBox>
    <mx:TextInput id="searchString" change="callQuery()" enabled="true" />
    <mx:DataGrid id="dg" width="100%" height="100%">
        <mx:columns>
            <mx:DataGridColumn id="lastName" dataField="lastName" headerText="Last Name" />
            <mx:DataGridColumn id="firstName" dataField="firstName" headerText="First Name" />
            <mx:DataGridColumn id="email" dataField="email" headerText="Email Address" />
        </mx:columns>
    </mx:DataGrid>
    </mx:VBox>
 </mx:WindowedApplication>

1 Ответ

0 голосов
/ 17 августа 2011

Вы уверены, что база данных открывается?Чтобы упростить отладку (поскольку по умолчанию многие ошибки не отображаются), попробуйте следующее.

_responder = new Responder(resultEventHandler, errorEventHandler);
conn = new SQLConnection();
conn.openAsync(dbFile, SQLMode.READ, _responder);           

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

    private function queryError( event:SQLErrorEvent ):void {
        trace("ERROR: ", event.error );
    }

, чтобы вы могли видеть полную ошибку, а не просто BREAKER.

...