До Android P все работало с моим кодом, но сейчас в Android P у меня много проблем с базами данных.
У меня есть файлы базы данных .db sqlite, хранящиеся в папке assets.Я импортировал их в пространство базы данных Android, и он работал нормально до Android P. В Android P я получаю это исключение: SQLite: No Such Table Error
Я искал здесь и нашел это, и я попытался применитьпринятый ответ: Android P - «SQLite: Ошибка такой таблицы» после копирования базы данных из ресурсов
Проблема в том, что теперь у меня возникла другая проблема, и она все еще не работает.Теперь у меня проблема в том, что каждый раз, когда я пытаюсь проверить, существует ли база данных, этот код всегда возвращает true, поэтому я никогда не создаю базу данных .Даже если база данных еще не создана, даже с недавно установленным приложением:
private boolean checkIfDBExists() {
File dbFile = new File(DB_COMPLETE_PATH);
return dbFile.exists();
}
Мой исходный код - это исходный код принятого ответа в ранее цитируемом вопросе stackoverflow.
Новый AndroidP требуемый способ получения пути к БД:
public static String getDatabasePath(String fileNname){
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(ApplicationContextProvider.getContext(), fileNname);
SQLiteDatabase database = helper.getReadableDatabase();
String path = database.getPath();
database.close();
return path;
}
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public MySQLiteOpenHelper(Context context, String databaseName) {
super(context, databaseName, null, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
db.disableWriteAheadLogging();
}
}
Мой класс DBHelper:
public class DbHelper extends SQLiteOpenHelper{
private String DB_NAME;
private String DB_COMPLETE_PATH;
private SQLiteDatabase mDataBase;
private static final int DATABASE_VERSION = 1;
public DbHelper(String name) throws IOException {
super(ApplicationContextProvider.getContext(), name+".db", null, DATABASE_VERSION);
this.DB_NAME = name+".db";
this.DB_COMPLETE_PATH = Util.getDatabasePath(DB_NAME);
boolean mustOverWriteDB;
if (checkIfDBExists()==false) {
createDataBase();
}
openDataBase();
}
private void createDataBase() throws IOException {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void copyDataBase() throws IOException {
InputStream myInput = App.getInstance().getAssetsFile(DB_NAME);
String outFileName = DB_COMPLETE_PATH;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
}