web-dev-qa-db-fra.com

Impossible d'ouvrir la base de données dans Android Pie (Android 9)

J'ai utilisé la fonction checkDataBase pour vérifier si la base de données existe déjà afin d'éviter de recopier le fichier à chaque fois que vous ouvrez l'application dans Oreo. Mais dans Android Pie, cela ne fonctionne pas.

private boolean checkDataBase (String dbName, int dbVersion) {

    SQLiteDatabase checkDB = null;

    try {

        String myPath = DB_PATH + dbName;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.CONFLICT_ABORT);

        if (checkDB.getVersion() < dbVersion) {
            Timber.d("Delete database called");
            myContext.deleteDatabase(dbName);
            return false;
        }
    } catch(SQLiteException e) {

    }

    if(checkDB != null){
        checkDB.close();
    }

    return checkDB != null;
}

Obtenir cette erreur: os_unix.c: 36667: (2) open (/data/data/my.androidPieTrial.app/databases/admin.db) Android.database.sqlite.SQLiteCantOpenDatabaseException: erreur inconnue (code 14 SQLITE_CANTOPEN): impossible d'ouvrir la base de données

3
Veeresh P

J'ai la solution. Dans la version Android Oreo et inférieure, la façon dont j'accède à la base de données fonctionne bien, mais elle ne fonctionnait pas sous Android Pie. C'est le moyen de la gérer dans Android Pie.

if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        MySQLiteOpenHelper helper = new MySQLiteOpenHelper();
        SQLiteDatabase database = helper.getReadableDatabase();
        myPath = database.getPath();

    } else {
        String DB_PATH = Environment.getDataDirectory() + "/data/my.trial.app/databases/";
        myPath = DB_PATH + dbName;
    }

    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    checkDB.disableWriteAheadLogging();
9
Veeresh P
context.getDatabasePath(the_database_name).getPath();

Fonctionne bien puisque getDatabasePath() renvoie le chemin absolu sur le système de fichiers où une base de données a été créée.

1
Mansoor Ali