Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android targetSdkVersion=26的AIR SQLite错误_Android_Sqlite_Actionscript 3_Air - Fatal编程技术网

Android targetSdkVersion=26的AIR SQLite错误

Android targetSdkVersion=26的AIR SQLite错误,android,sqlite,actionscript-3,air,Android,Sqlite,Actionscript 3,Air,我有一个运行良好的移动应用程序(android/ios),但谷歌要求开发者现在就使用targetSdkVersion 26(我的到目前为止只有19个)。 现在我使用26,我有一个错误#3125: 以下是我打开数据库的代码: static private function openDatabase(datebaseName:String) { sqlCon = new SQLConnection(); dbDir = File.docume

我有一个运行良好的移动应用程序(android/ios),但谷歌要求开发者现在就使用targetSdkVersion 26(我的到目前为止只有19个)。 现在我使用26,我有一个错误#3125:

以下是我打开数据库的代码:

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

经过几天的搜索,我终于找到了解决方案,这是一个许可问题,就像奥古斯说的

我为任何有相同问题的人发布了我的解决方案,而不是调用我的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);
        }       

    }   

可能是这样的:如果不是,那么我仍然认为这是一个权限问题,而不是代码问题。你可能会发现这个链接很有用,它具有预期的行为。数据库不会代表您创建文件夹。要解决这个问题,您只需要添加一些代码来确保目录已经存在。例如:
File.applicationStorageDirectory.resolvePath(“db”).createDirectory()我已经尝试过这些解决方案,但没有效果。我真的不明白为什么改变targetSdkVersion会导致这个错误!
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);
        }       

    }