2010-12-13 8 views
1

SQLiteとAdobe AIRとのインターフェースに苦労しています。私はAIR 2.0でFlex 4 SDKを使用しています。 InsideRIA(http://insideria.com/2008/04/air-api-additional-query-tech.html)のDavid Tuckerによるチュートリアルのコードを修正しました。私はFlashDevelopで書いています(これは私の問題かもしれません)、コンパイルしてアプリを実行できます。問題は、私がdbファイルを検索するときに、私はいつも 'BREAKER'トレース(つまり、 'queryError'関数が呼ばれています)という結果になる何らかのエラーが発生することです。私は単にデータベース上でSQLコマンドを実行しようとしましたが、正常に動作するので、FlexまたはAIRがクエリを処理する方法のどこかに問題があります(または、間違いなくコーディングに間違いが生じた可能性があります)。誰でも手伝ってくれてありがとう。私のコードは次の通りです:Flex/AIRアプリケーションを使用したSQLiteデータベースの照会

<?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> 

答えて

0

データベースは開かれていますか?デフォルトでは多くのエラーが黙っているので、デバッグを簡単にするには、以下を試してください。

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

ここで、2つのイベントハンドラは、開いているかどうかを示します。また、結果エラーハンドラを

に変更してください。
private function queryError(event:SQLErrorEvent):void { 
     trace("ERROR: ", event.error); 
    } 

これでBREAKERの代わりに完全なエラーが表示されます。

関連する問題