Ошибка «невозможно открыть файл базы данных» в Flex для Android - PullRequest
1 голос
/ 01 ноября 2011

Используя 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 ]

2 голосов
/ 24 ноября 2012

Я знаю, что это старый вопрос, но в любом случае я столкнулся с той же ошибкой и нашел причину. Если какой-либо из родительских каталогов файла, который вы передаете SQLConnection.open(), не существует, Flash Player выдает Error с detailID=1001. Просто позвоните dbFile.parent.createDirectory() и ошибка должна исчезнуть.

Аналогичный ответ был дан на форумах Adobe: SQLError # 3125

0 голосов
/ 08 ноября 2012

По крайней мере, часть проблемы связана со смешением метода open () класса SQLConnection - который является синхронным - с событиями, которые должны использоваться только при открытии асинхронного соединения. Вы бы открыли асинхронное соединение, используя метод openAsync () вместо метода open ().

Документы в этом вопросе противоречивы, поскольку фактически можно прослушивать SQLEvent.OPEN при открытии синхронного соединения. Однако обратите внимание, что слушатель SQLErrorEvent.ERROR не запускается в вашем коде, и вместо этого вы получаете ошибку времени выполнения. В документах не упоминается SQLErrorEvent.ERROR, работающий с синхронным соединением; это действительно так.

Возможно, это ошибка AIR, но я подозреваю, что смешивание синхронных методов с асинхронными прослушивателями событий - просто серая область. Также вероятно, что проблема может быть решена, если вместо этого вы поместите вызов open () в блок try / catch, который является рекомендуемым способом перехвата синхронных ошибок:

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); 
}
0 голосов
/ 01 ноября 2011

Вы проверили «обычных подозреваемых»?

  • файл существует
  • не заблокировано каким-либо другим приложением / устаревшей версией вашего приложения
  • путь правильный
...