Поддержка sqlite для openfl

Я пытаюсь отказаться от поддержки sqlite для сохранения оценки и некоторых флагов. Мне нужно открыть базу данных, если она существует, а затем инициировать игровые значения на основе базы данных. Если db не существует, мне нужно создать / инициализировать его. Приведенный ниже код компилируется, но дает сбой по неизвестной причине.

    package mygame;

     <snip imports>

    import sys.db.Types;

    class ScoreDB extends sys.db.Object {
        public var id : SId;
        public var dbscore1 : SInt;
        public var dbsound  : SInt;
        public var dbscore2 : SInt;
    }

    class mygame extends Sprite {

            <snip var defines>

      public function new () {

             // start sqlite code
             sys.db.Manager.initialize();


     // db does exist
    //  then read values 
            //  currentScore = score1.dbscore1;
        //  doSound = score1.dbsound;
        //  doScore = score1.dbscore2;

    // db does not exist:

    var cnx = sys.db.Sqlite.open("mybase.db");
        sys.db.Manager.cnx = cnx;
    sys.db.TableCreate.create(ScoreDB.manager);

    var score1 = new ScoreDB();
        score1.id = 0;
    score1.dbscore1 = 0;
        score1.dbsound  = 0;
        score1.dbscore2 = 0;
    score1.insert();

            currentScore = 0;
        doSound = 0;
        doScore = 0;


        cnx.close();

        // end sqlite code

     super ();
     initialize ();
         construct ();
     newGame ();


 }

person Jocala    schedule 04.05.2014    source источник
comment
Вы пытались запустить его в режиме отладки, чтобы получить сообщение об ошибке (если это Android, мне повезло запустить проект, созданный openfl, в eclipse и использовать его журнал каталогов)? Кроме того, какую цель вы тестируете?   -  person npretto    schedule 05.05.2014
comment
Это нацелена на отладку Android. Я сделал логарифм, но ничего полезного не увидел. Я не использую eclipse или какой-либо графический интерфейс, vi и консоль только из-за проблем со зрением.   -  person Jocala    schedule 05.05.2014
comment
Это может быть связано с тем, что Android (или iOS) имеет заблокированную среду, и только определенные папки имеют доступ на запись. Если SQLite попытается записать в заблокированную папку, я думаю, это вызовет ошибку. Я не уверен, как лучше всего получить путь к записываемой папке в OpenFL, но я думаю, что это было бы лучше всего для дальнейшего исследования.   -  person Jason O'Neil    schedule 05.05.2014


Ответы (2)


На самом деле я решил ту же проблему.

Проблема в том, что приложение по сути представляет собой файл .zip, и его нельзя редактировать. Вам необходимо создать (а затем получить доступ) БД в каталоге хранилища приложений.

Для доступа к каталогу используйте следующий код:

private static var localStoragePath:String = openfl.utils.SystemPath.applicationStorageDirectory;

Существует известная ошибка, заключающаяся в том, что в среде IDE не отображается класс SystemPath, но не обращайте на это внимания, он скомпилируется без проблем. Позже с помощью обычных инструментов вы сможете читать и записывать каталог, создавать новые папки и т. Д.

Вот быстрый тест, чтобы убедиться, что он работает и не дает сбоев:

// creating a test folder
sys.FileSystem.createDirectory(openfl.utils.SystemPath.applicationStorageDirectory + "/testFolder");

var form:TextFormat = new TextFormat(null, 22, 0xFFFFFF);

// getting contents of the storage dir  
var arr = sys.FileSystem.readDirectory(openfl.utils.SystemPath.applicationStorageDirectory);

var tf:TextField = new TextField();
tf.defaultTextFormat = form;
tf.width = Lib.current.stage.stageWidth;
tf.height = Lib.current.stage.stageHeight;
tf.multiline = true;
tf.wordWrap = true;
tf.text = arr.toString();

addChild(tf);

как вы увидите, вновь созданная папка есть. Вы можете удалить строку, которая создает папку, и убедитесь, что это безопасно.

О, не забудьте добавить разрешения Android в XML-файл:

<android permission="android.permission.WRITE_EXTERNAL_STORAGE"/>
person Creative Magic    schedule 13.05.2014
comment
Моя программа по-прежнему закрывается, как только попадает в первый оператор sqlite. Я попытался указать sqlite в настраиваемый каталог, но без радости. Каталог создан, но создать файл для sqlite не удается. - person Jocala; 15.05.2014

Насколько я знаю, в openfl нет определений sqlite. А те, которые вы используете, - это просто обычное определение цели cpp. Полагаю, проблема в том, что они не работают на андроиде. Более того: я совершенно уверен, что определения api в порядке, но он пытается загрузить dll с неправильным именем, что, вероятно, убивает ваше приложение, даже не выдавая ошибки. Попробуйте разобраться в реализации (она короткая и понятная) и изменить имя dll.

person stroncium    schedule 21.05.2014