2010-12-13 8 views
1

Ich habe Probleme mit dem Versuch, eine Verbindung mit SQLite und Adobe AIR herzustellen. Ich verwende das Flex 4 SDK mit AIR 2.0. Ich habe Code aus einem Tutorial von David Tucker auf InsideRIA (http://insideria.com/2008/04/air-api-additional-query-tech.html) geändert. Ich schreibe in FlashDevelop (was vermutlich mein Problem sein könnte), und ich kann die App kompilieren und ausführen. Das Problem ist, dass wenn ich die db-Datei durchsuche, bekomme ich immer einen Fehler, der in der "BREAKER" -Spur resultiert (dh - die "queryError" -Funktion wird aufgerufen). Ich habe versucht, einfach den SQL-Befehl auf der db ausgeführt und es funktioniert gut, so gibt es ein Problem irgendwo in der Art, wie Flex oder AIR meine Abfrage behandelt (oder natürlich hätte ich einen Fehler bei der Codierung gemacht haben). Danke an alle, die Ihnen helfen können. Mein Code ist wie folgt:Abfragen der SQLite-Datenbank mit der Flex/AIR-App

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

Antwort

0

Sind Sie sicher, dass die Datenbank geöffnet wird? Um das Debuggen zu vereinfachen (da standardmäßig viele Fehler still sind), versuchen Sie Folgendes.

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

wo die beiden Event-Handler anzeigen, ob die Öffnung in Ordnung ist. Ändern Sie auch Ihr Ergebnis Fehlerbehandlung

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

So können Sie den vollständigen Fehler sehen, statt nur BREAKER.