4

私はまだ Adob​​e Air/Flex の初心者であり、SQL についてはまだかなり新しいものです。

私はこの( http://coenraets.org/blog/2008/11/using-the-sqlite-database-access-api-in-air …-part-1/) コードをダウンロードし、それを調べてきました。私は同じアイデアを実装しようとしています。

馬鹿なことばかりだと思います。Flex Builder を使用しています。新しいデスクトップ アプリケーション プロジェクトを作成しましたが、何もインポートしませんでした。

DataGrid オブジェクトを追加し、それを ArrayCollection にバインドしました。

プログラムが初期化されるときに、データベースが存在する場合はデータベースからデータをロードし、存在しない場合は新しいデータベースを作成するようにしようとしています。

問題は、アプリケーションの実行時にデータグリッドが空であることです。列ヘッダーもデータも何もありません。たくさんのものを変更しようとしました。デバッガーを使用して、すべての関数が想定どおりに呼び出されていることを確認しました。何が間違っているのかわかりません。私は自分のコードを前述のコードと比較し、Google でチュートリアルを探しました。私が間違っていることを知っている人はいますか?

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="672" height="446"
    applicationComplete="onFormLoaded()"
    title="iRecipes">

    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            private var sqlConnection:SQLConnection;
            [Bindable] private var recipeList:ArrayCollection;

            private function onFormLoaded():void
            {
                sqlConnection = new SQLConnection();
                openDataBase();
            }

            private function openDataBase():void
            {
                var file:File = File.userDirectory.resolvePath("recipes.db");

                sqlConnection.open(file, SQLMode.CREATE);

                if(!file.exists)
                {
                    createDatabase();
                }           

                populateRecipeList()
            }

            private function createDatabase():void
            {
                var statement:SQLStatement = new SQLStatement();
                statement.sqlConnection = sqlConnection;
                statement.text = "CREATE TABLE Recipes (recipeId INTEGER PRIMARY KEY AUTOINCREMENT, recipeName TEXT, authorName TEXT)";
                statement.execute();

                statement.text = "INSERT INTO Recipes (recipeName, authorName) VALUES (:recipeName, :authorName)";

                statement.parameters[":recipeName"] = "Soup";
                statement.parameters[":authorName"] = "Joel Johnson";
                statement.execute();

                statement.parameters[":recipeName"] = "Garbage";
                statement.parameters[":authorName"] = "Bob Vila";
                statement.execute();
            }

            private function populateRecipeList():void
            {
                var statement:SQLStatement = new SQLStatement();
                statement.sqlConnection = sqlConnection;

                statement.text = "SELECT * FROM Recipes";
                statement.execute();
                recipeList = new ArrayCollection(statement.getResult().data);
            }
        ]]>
    </mx:Script>

    <mx:DataGrid dataProvider="{recipeList}">

    </mx:DataGrid>
</mx:WindowedApplication>
4

2 に答える 2

3

ありがとうフィート。あなたの提案で、私はそれを理解したと思います。ifステートメントを次のように変更しました。

            if(!file.exists)
            {
                sqlConnection.open(file, SQLMode.CREATE);
                createDatabase();
            }
            else            
            {
                sqlConnection.open(file, SQLMode.UPDATE);
            }

そしてそれは素晴らしい働きをします。ご協力いただきありがとうございます。

于 2008-12-29T04:49:15.847 に答える
3

私はあなたのコードを使ってこれを試しました。テーブルが存在しないというエラーが発生していたため、変更を加えて条件を削除しました。

 //if(!file.exists)
 //{
   createDatabase();
 //}

これにより、正しい情報を示すデータグリッドが得られました。データベースファイルの初期化方法に問題があると思います。現時点で検討中です。

使ってみて

sqlConnection.open(file, SQLMode.CREATE);

代わりに、データベースを開くため。

于 2008-12-28T10:04:44.183 に答える