Ошибка AIR SQLite с targetSdkVersion = 26

У меня есть мобильное приложение (android / ios), которое отлично работает, но Google просит разработчиков использовать targetSdkVersion 26 сейчас (у меня пока было 19). И теперь, когда я использую 26, у меня ошибка № 3125:

SQLError: 'Error #3125: Unable to open the database file.', details:'Connection closed.', operation:'open', detailID:'1001'

Вот мой код для открытия базы данных:

static private function openDatabase(datebaseName:String) {

        sqlCon = new SQLConnection();           

        dbDir = File.documentsDirectory.resolvePath("ZANORG");
        dbDirFile = File.documentsDirectory.resolvePath("ZANORG/" + datebaseName + ".db");          

        if (dbDirFile.exists) {
            trace("File exists");
            sqlCon.addEventListener(SQLEvent.OPEN, onDatabaseOpen);
            sqlCon.open(dbDirFile);     // Error #3125 is here                      
        } else {
            trace("File does not exist");

            if (!dbDir.exists){
                trace("Folder doesn't exist > Create");
                try{
                    dbDir.createDirectory();
                }catch (error:Error){                       
                    trace("ERROR");
                    return;
                } 
            }
            sqlCon.addEventListener(SQLEvent.OPEN, onDatabaseCreationOpen);
            sqlCon.open(dbDirFile);             

            var strReq:String = "CREATE TABLE IF NOT EXISTS gamedata (Score INT)";              
            sqlquery(strReq);


            strReq = "INSERT INTO gamedata (Score) values(0)";
            sqlquery(strReq);
        }
    }

Вероятно, это: stackoverflow.com/questions/39103863/… Если нет, то я все еще думаю, что это проблема разрешение, а не кода.

Organis 10.06.2018 12:26

Вы можете найти эту ссылку полезной SQLError # 3125, у которой есть Это ожидаемое поведение. База данных не будет создавать папки от вашего имени. Чтобы исправить это, вам просто нужно добавить код, чтобы убедиться, что каталог уже существует. Например: File.applicationStorageDirectory.resolvePath("db").createDir‌​ectory();

MikeT 10.06.2018 12:36

Я уже пробовал эти решения, но безрезультатно. Я действительно не понимаю, почему изменение targetSdkVersion вызывает эту ошибку!

kek 11.06.2018 08:42
0
3
168
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После нескольких дней поисков я наконец нашел решение, это проблема с разрешением, как сказал Органис.

Я публикую свое решение для всех, у кого такая же проблема, вместо того, чтобы вызывать мою функцию openDatabase, я вызываю эту функцию checkDatabase:

private static function checkDatabase(databaseName:String){
        dbDirFile = File.documentsDirectory.resolvePath("ZANORG/" + databaseName + ".db");
        dbDir = File.documentsDirectory.resolvePath("ZANORG");

        if (File.permissionStatus != PermissionStatus.GRANTED){
            dbDir.addEventListener(PermissionEvent.PERMISSION_STATUS, function(e:PermissionEvent):void {
                if (e.status == PermissionStatus.GRANTED){
                    openDatabase(databaseName);
                }else{
                    // permission denied
                }
            });                  

            try {
                dbDir.requestPermission();
            }catch(e:Error){

                // another request is in progress

            }
        }else{
            openDatabase(databaseName);
        }       

    }   

Другие вопросы по теме