【问题标题】:Sqlite support for openfl对 openfl 的 Sqlite 支持
【发布时间】:2014-05-04 21:00:04
【问题描述】:

我正在尝试加入 sqlite 支持以保存分数和一些标志。如果数据库存在,我需要打开它,然后根据数据库初始化游戏值。如果数据库不存在,我需要创建/初始化它。下面的代码可以编译,但由于未知原因崩溃。

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


 }

【问题讨论】:

  • 您是否尝试过在调试模式下运行它以获取一些错误消息(如果它是 android,我有幸在 eclipse 中运行 openfl 创建的项目并使用它的 catlog)?另外,你在测试什么目标?
  • 它是针对 android 调试的。我做了一个 logcat,但没有看到任何有用的东西。由于视力问题,我不使用 eclipse 或任何 gui、vi 和控制台。
  • 这可能与具有锁定环境的 Android(或 iOS)有关,并且只有某些文件夹具有写入权限。如果 SQLite 尝试写入锁定的文件夹,我猜它会导致错误。我不确定在 OpenFL 中获取可写文件夹路径的最佳方法是什么,但我认为这将是接下来研究的最佳方法。

标签: sqlite flash haxe openfl


【解决方案1】:

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

问题在于该应用程序本质上是一个 .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"/>

【讨论】:

  • 我的程序在遇到第一个 sqlite 语句时仍然关闭。我尝试将 sqlite 指向自定义目录,但没有任何乐趣。目录已创建,但 sqlite 的文件创建失败。
【解决方案2】:

据我所知,openfl 中没有 sqlite 定义。而你使用的只是普通的 cpp 目标定义。我想问题是它们不适用于android。更重要的是:我很确定 api 定义没问题,但它会尝试使用错误的名称加载 dll,这可能会杀死你的应用程序而不会发出错误。尝试研究实现(它简短易懂)并更改 dll 名称。

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2012-08-23
    相关资源
    最近更新 更多