1

私は現在、Flexを学ぶためのトレーニングビデオをフォローしており、ビデオの方向にできるだけ近づこうとしています。エラーを修正する方法を見つけようとしています。

エラー#2044:未処理のSQLErrorEvent:。errorID = 3115、operation = execute、message = Error#3115:SQLエラー。、details =そのようなテーブルはありません:'archivelist'

テーブルは、トレーニングに従ってこのコードで作成する必要があります。

<fx:Script>
    <![CDATA[
        import mx.utils.OnDemandEventDispatcher;

        public var ArchiveFile:File;
        public var dbConnection:SQLConnection;



        private function createDatabase():void
        {
            ArchiveFile = File.applicationStorageDirectory.resolvePath("archive.db");
            dbConnection = new SQLConnection();
            dbConnection.addEventListener(SQLEvent.OPEN, onDatabaseOpen);
            dbConnection.addEventListener(SQLEvent.CLOSE, onDatabaseClose);

            dbConnection.openAsync(ArchiveFile);
        }

        private function onDatabaseOpen(evt:SQLEvent):void
        {
            trace("Database is now open");
            var statement:SQLStatement = new SQLStatement();
            statement.sqlConnection = dbConnection;
            statement.text = "CREATE TABLE IF NOT EXISTS archivelist (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT , journal TEXT)";

            statement.execute();

            }       

        private function onDatabaseClose(evt:SQLEvent):void
        {
            trace("Database is now closed");
        }

        private function saveJournal():void
        {

            var statement:SQLStatement = new SQLStatement();
            statement.sqlConnection = dbConnection;
            statement.text = "INSERT INTO archive (title , journal) VALUES ('"+title_txt.text+"','"+journal_txt.text+"')";

            statement.execute();

            title_txt.text = "";
            journal_txt.text = "";

        }


    ]]>

次に、このコードを使用して別のビューで呼び出されます

<fx:Script>
    <![CDATA[
        import flash.data.SQLConnection 
        import flash.filesystem.File
        import mx.collections.ArrayCollection;

        public var ArchiveFile:File
        public var dbConnection:SQLConnection;
        public var selectQuery:SQLStatement;

        private function createDatabase():void
        {
            ArchiveFile = File.applicationDirectory.resolvePath("archive.db");
            dbConnection = new SQLConnection();
            dbConnection.addEventListener(SQLEvent.OPEN, onDatabaseOpen);
            dbConnection.addEventListener(SQLEvent.CLOSE, onDatabaseClose);

            dbConnection.openAsync(ArchiveFile)
        }

        private function onDatabaseOpen(evt:SQLEvent):void
        {
            trace("Database is now open");
            selectQuery = new SQLStatement();
            selectQuery.sqlConnection = dbConnection;
            selectQuery.text = "SELECT * FROM archivelist ORDER BY title ASC";
            selectQuery.addEventListener(SQLEvent.RESULT, onQueryResult);   

            selectQuery.execute();  
        }

        private function onQueryResult(evt:SQLEvent):void
        {
            archivefiles.dataProvider = new ArrayCollection(selectQuery.getResult().data);
        }

        private function onDatabaseClose(evt:SQLEvent):void
        {
            trace("Database is now Closed");
        }

    ]]>

ビデオでは、トレーナーがdatabase.dbと呼ばれるビューの下に青いファイルを持っていることに注意することが重要です。彼らはこのファイルまたはそれを作成する方法を提供していません。私自身の意味では、データベースの名前をアーカイブに変更し、テーブルの名前をアーカイブリストに変更しました。私の最終的な目標は、複数のビューがアクセス/書き込みできる1つのデータベースを作成することです。ベストプラクティスを使用しているので、できるだけトレーニングに近づこうとしています。私は与えられたどんな助けにも大いに感謝します。誰かがこれが新しい質問だと感じたら、事前に謝罪します。私はこれをグーグルで調べて、トレーニングビデオですべてのキャラクターを数時間チェックしました。みんな違うやり方をしているようで、ベストプラクティスのやり方をしようとしています。

ありがとうございました

4

1 に答える 1

1

UIがフリーズしないように、データベースインタラクティブには常に非同期モードを使用してください。

エラー#2044:未処理のSQLErrorEvent。非同期モードを開くべきではないため、同期モードにする必要があります(SYNCモードで作業しようとしていると思います)

dbConnection.open(ArchiveFile); //  not openAsync(ArchiveFile);

または次のようなSQLErrorEventを処理する必要があります

dbConnection.addEventListener(SQLErrorEvent.ERROR, onDatabaseCloseError);

最良の方法 :

1)DAOパターン(Sun Java)について読む必要があります

2)アプリケーション全体に単一の接続を使用して、すべてのDAOクラスでsqlconnectionを表示します(Sqliteは同時実行をサポートしていないため、単一の接続を使用します)。

3)使用する場合、接続プールのパフォーマンスは向上しますが、データベースファイルが現在ロックされているなどの問題があります。

4)パラメータ化されたクエリを使用してSQLインジェクションを回避します(パフォーマンスも向上します)

サンプルアプリケーションが必要な場合は、このリンクをたどってくださいhttp://coenraets.org/blog/2008/02/salesbuilder-for-air-10/ この人は、SQLクエリ用の優れたユーティリティを作成します。非同期データベース操作Salesbuilderアプリケーション

コピーして貼り付けてください。期待どおりに動作します。

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="windowedapplication1_creationCompleteHandler(event)">

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.events.FlexEvent;
        protected function btnGetArchiveList_clickHandler(event:MouseEvent):void
        {
            getArchiveList();
        }

        protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
        {
            createDatabase();               
        }

        private var ArchiveFile:File
        private var dbConnection:SQLConnection;
        private var selectQuery:SQLStatement;

        private function createDatabase():void
        {
            ArchiveFile = File.applicationStorageDirectory.resolvePath("archive.db"); //Note here best practices to create db file here applicationStorageDirectory
            dbConnection = new SQLConnection();
            dbConnection.addEventListener(SQLEvent.OPEN, onDatabaseOpen);
            dbConnection.addEventListener(SQLEvent.CLOSE, onDatabaseClose);
            dbConnection.addEventListener(SQLErrorEvent.ERROR, onDatabaseError);
            dbConnection.openAsync(ArchiveFile)
        }

        protected function onDatabaseError(event:SQLErrorEvent):void
        {
            trace(event.error.getStackTrace());
        }

        private function onDatabaseOpen(evt:SQLEvent):void
        {
            trace("Database is now open");
            var statement:SQLStatement = new SQLStatement();
            statement.sqlConnection = dbConnection;
            statement.text = "CREATE TABLE IF NOT EXISTS archivelist (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT , journal TEXT)";
            statement.addEventListener(SQLEvent.RESULT, onTableCreate_ResultHandler);   
            statement.addEventListener(SQLErrorEvent.ERROR, onDatabaseError);
            statement.execute();;
        }

        protected function onTableCreate_ResultHandler(event:SQLEvent):void
        {
            trace("Table created successfully") // Here after only you need to call all query like getArchiveList()
        }

        private function getArchiveList():void
        {
            trace("Getting ArchiveList");
            var selectQuery:SQLStatement = new SQLStatement();
            selectQuery.sqlConnection = dbConnection;
            selectQuery.text = "SELECT * FROM archivelist ORDER BY title ASC";
            selectQuery.addEventListener(SQLEvent.RESULT, onQueryResult);   
            selectQuery.addEventListener(SQLErrorEvent.ERROR, onDatabaseError);   
            selectQuery.execute();
        }

        private function onQueryResult(event:SQLEvent):void
        {
            archivefilesList.dataProvider = new ArrayCollection(((event.currentTarget) as SQLStatement).getResult().data);
        }

        private function onDatabaseClose(evt:SQLEvent):void
        {
            trace("Database is now Closed");
        }

        private function saveJournal():void
        {
            var statement:SQLStatement = new SQLStatement();
            statement.sqlConnection = dbConnection;
            statement.text = "INSERT INTO archivelist (title , journal) VALUES ('"+txtTitle.text+"','"+txtJournal.text+"')"; //Note here archivelist table name
            statement.addEventListener(SQLEvent.RESULT, onInsertQuery_ResultHandler);   
            statement.addEventListener(SQLErrorEvent.ERROR, onDatabaseError);   
            statement.execute();
            txtTitle.text = "";
            txtJournal.text = "";

        }

        protected function btnSave_clickHandler(event:MouseEvent):void
        {
            saveJournal();              
        }

        protected function onInsertQuery_ResultHandler(event:SQLEvent):void
        {
            var isInserted:Boolean = ((event.currentTarget) as SQLStatement).getResult().rowsAffected > 0;

            if(isInserted)
                trace("inserted successfully")
            else
                trace("insert failed");

        }

    ]]>
</fx:Script>

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<s:layout>
    <s:VerticalLayout/>
</s:layout>
<s:TextInput id="txtTitle"/>
<s:TextInput id="txtJournal"/>
<s:Button id="btnSave" label="Save" click="btnSave_clickHandler(event)"/>

<s:Button id="btnGetArchiveList" label="Get Archive" click="btnGetArchiveList_clickHandler(event)"/>
<s:List id="archivefilesList" labelField="title" width="200" height="300"/>

</s:WindowedApplication>
于 2012-11-09T05:52:33.677 に答える