我一直在努力尝试与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>
答案 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。