Sqlite支持openfl

时间:2014-05-04 21:00:04

标签: sqlite flash haxe openfl

我试图放弃sqlite支持来保存分数和一些标志。我需要打开db(如果存在),然后根据db初始化游戏值。如果db不存在,我需要创建/ init它。下面的代码编译但崩溃的原因不明。

    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 ();


 }

2 个答案:

答案 0 :(得分:0)

我实际上刚刚解决了同样的问题。

问题是该应用程序本质上是一个.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);

正如您所见,新创建的文件夹就在那里。您可以删除创建该文件夹的行,并确保其安全。

哦,不要忘记在XML文件中添加Android权限:

<android permission="android.permission.WRITE_EXTERNAL_STORAGE"/>

答案 1 :(得分:0)

据我所知,openfl中没有sqlite定义。你使用的只是正常的cpp目标定义。我想问题是他们不能在android上工作。更多:我非常确定api定义是正确的,但是它尝试使用错误的名称加载dll,这可能会杀死你的应用程序,甚至不会出错。尝试查看实现(它简短易懂)并更改dll名称。