Flex for Android中的“无法打开数据库文件”错误

时间:2011-11-01 14:35:27

标签: android flex sqlite air

使用Flex 4.5进行Android开发,这是应该创建数据库的脚本:

private var db:File = File.userDirectory.resolvePath("events.db");
        private var conn:SQLConnection;

        public function MyDB() {
            conn = new SQLConnection();
            conn.addEventListener(SQLEvent.OPEN, openHandler);
            conn.addEventListener(SQLErrorEvent.ERROR, errorHandler);
            conn.open(db, );
        }

我添加了此权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

但是我收到了这个错误:

SQLError: 'Error #3125: Unable to open the database file.', details:'Connection closed.', operation:'open', detailID:'1001'
    at flash.data::SQLConnection/internalOpen()
    at flash.data::SQLConnection/open()
    at com.galleons.util::MyDB()[/Users/luca/Documents/Adobe Flash Builder 4.5/Galleons/src/com/galleons/util/MyDB.as:24]

3 个答案:

答案 0 :(得分:2)

我知道这是一个老问题,但无论如何我面临同样的错误并找到原因。如果您传递给SQLConnection.open()的文件的任何父目录不存在,Flash Player将使用Error抛出detailID=1001。只需致电dbFile.parent.createDirectory(),错误即告消失。

在Adobe论坛上给出了类似的答案:SQLError #3125

答案 1 :(得分:0)

你检查过'通常的嫌疑人'吗?

  • 文件存在
  • 未被应用的其他应用/陈旧版本锁定
  • 路径正确

答案 2 :(得分:0)

至少部分问题是由于将SQLConnection类的open()方法(同步)与仅在打开异步连接时应该使用的事件混合在一起。您可以使用openAsync()方法而不是open()方法打开异步连接。

文档在这个问题上是矛盾的,因为实际上,打开同步连接时可以监听SQLEvent.OPEN。但是,请注意,代码中未触发SQLErrorEvent.ERROR侦听器,而是出现运行时错误。文档没有提到SQLErrorEvent.ERROR使用同步连接;看来确实如此。

这可能是一个AIR bug,但我怀疑混合同步方法与异步事件监听器只是一个灰色区域。如果您在try / catch块中包含open()调用,也可能解决问题,这是捕获同步错误的推荐方法:

try
{ 
    conn.open(db); 
    trace("Hey, is that a database?", (db.exists));
}
catch (err:SQLError) 
{ 
    trace("Error, database not created:", err.message); 
    trace("Error details:", err.details); 
}