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
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();
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.