使用Flex / AIR应用程序查询SQLite数据库

时间:2010-12-13 18:36:47

标签: flex sqlite flex4 air

我一直在努力尝试与SQLite和Adobe AIR进行交互。我正在使用带有AIR 2.0的Flex 4 SDK。我修改了David Tucker关于InsideRIA(http://insideria.com/2008/04/air-api-additional-query-tech.html)的教程中的代码。我正在写FlashDevelop(我想这可能是我的问题),我可以编译并运行应用程序。问题是,当我去搜索db文件时,我总是得到一些错误,导致'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 :(得分:0)

您确定数据库正在打开吗?为了使调试更容易(因为默认情况下许多错误都是静默的),请尝试以下操作。

_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。