Проблема с базой данных Adobe Air / Flex + SQLite - PullRequest
4 голосов
/ 28 декабря 2008

Я все еще новичок в Adobe 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>

Ответы [ 2 ]

3 голосов
/ 29 декабря 2008

Спасибо Ноги. С твоим предложением, я думаю, я понял это. Я изменил выражение if на это:

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

И это прекрасно работает. Спасибо за вашу помощь.

3 голосов
/ 28 декабря 2008

Я только что попробовал это, используя ваш код. Я внес изменение и удалил условие, так как получал ошибки о том, что таблица не существует.

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

Получил сетку данных с правильной информацией. Я думаю, что с инициализацией файла базы данных что-то не так. Сейчас я изучаю это.

Попробуйте использовать

sqlConnection.open(file, SQLMode.CREATE);

вместо, для открытия базы данных.

...