问题
I used checkDataBase function to ensure if the database already exist to avoid re-copying the file each time you open the application in Oreo. But in Android Pie it is not working.
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;
}
Getting this error: os_unix.c:36667: (2) open(/data/data/my.androidPieTrial.app/databases/admin.db) android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
回答1:
I got the solution. In Android Oreo and below version, the way i am accessing db works fine but in Android Pie it wasn't working.This is the way to handle it in 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();
回答2:
Override following method on SQLiteOpenHelper class for android PIE OS version.
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
db.disableWriteAheadLogging();
}
}
回答3:
context.getDatabasePath(the_database_name).getPath();
Works fine since getDatabasePath()
returns the absolute path on the filesystem where a database created.
来源:https://stackoverflow.com/questions/51930153/unable-to-open-database-in-android-pie-android-9