0

Flash Builder 4.6を使用して、例としてhttp://www.flex-blog.com/adobe-air-sqlite-example (編集:リンクが壊れているようです)に従っていますが、コードの一部ではない仕事:

private function resault(e:SQLEvent):void
{
    // with sqls.getResault().data we get the array of objects for each row out of our database
    var data:Array = sqls.getResult().data;
    // we pass the array of objects to our data provider to fill the datagrid
    dp = new ArrayCollection(data);
}

実行時にプログラムをチェックすると、sqls.getResult() は有効な SQLResult オブジェクトを返しますが、そのデータは null です。

そして、私の前の質問からAdob​​e Air: convert sqlite's result [object Object] to String? 、私は間違った質問をしているようです。

それにもかかわらず、私は自分の SQLResult オブジェクトをチェックしました

trace(ObjectUtil.toString(sqls.getResult()));

すべてのコンテンツを sqlite から取得したことがわかります。

(flash.data::SQLResult)#0
  complete = true
  data = (Array)#1
    [0] (Object)#2
      first_name = "AAA"
      id = 1
      last_name = "BBB"
    [1] (Object)#3
      first_name = "AAA"
      id = 2
      last_name = "BBB"
    [2] (Object)#4
      first_name = "qqq"
      id = 3
      last_name = "qqq"
  lastInsertRowID = 0
  rowsAffected = 0

それで、ここで何が起こっているのですか?すべての sqlite 要素を解析し、それらを自分でデータ プロバイダーに配置するには、独自の関数を作成する必要がありますか? はい、私はそれを行うことができますが、真剣に、多くのチュートリアルが以下を使用して示しています:

var data:Array = sqls.getResult().data;
dp = new ArrayCollection(data);

さて、質問に戻ります: sqls.getResult().data が null になる原因として考えられるものは何ですか?

4

1 に答える 1

3

それはあなたがそこに従っている非常に良いチュートリアルのようには見えません (私の意見では)。そのコードには、実行中のすべてのステートメントに対して 1 つのイベント リスナーがあります。さまざまなクエリを実行する SQLStatement が 1 つしかありません。あなたのコードで何が問題なのか正確にはわかりませんが、そこに原因があると確信しています。(そして、ステートメントがまだ実行されているときにタイマーが遅延として使用されることについても、私を始めさせないでください。うん!)。Flex/AIR/SQLite を学習するためのより良い情報源を探すことを強くお勧めします。

新しい SQLStatement を作成するか、ステートメントの実行ごとに少なくとも個別のイベント ハンドラーを作成する必要があります。これを行うより良い方法は、次のようにResponderクラスを使用することです。

var stmt:SQLStatement = new SQLStatement();
stmt.sqlConnection = connection;
stmt.text = query;

var token:Responder = new Responder(onResult, onFail);
stmt.execute(-1, token);

ただし、データベースへの接続を常に開いたままにしておくことを気にしない場合は、SQLConnection を共有できます。

于 2012-05-07T09:11:37.917 に答える