Я понял проблему.
Эта проблема возникает только при копировании БД из активов.
БД в папке активов имеет версию по умолчанию 0. Так что, когда вы вызываете помощника по открытию базы данных с номером версии (скажем, 1), а затем перезаписываете его в том, что в ресурсах, номер версии сбрасывается в 0.
И когда вы вызываете db.getReadableDatabase () или db.getWriteableDatabase, который должен вызывать метод onUpgrade, происходит сбой, потому что номер версии 0, который должен быть новой базой данных. Вы можете посмотреть исходный код SqliteOpenHelper.
Он запускает метод onUpgrade только тогда, когда версия больше нуля, а текущая версия больше старой.
`
db.beginTransaction();
try {
//Skips updating in your case
if (version == 0) {
onCreate(db);
} else {
if (version > mNewVersion) {
onDowngrade(db, version, mNewVersion);
} else {
onUpgrade(db, version, mNewVersion);
}
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
`
Так вот, что я сделал, чтобы преодолеть эту проблему. Нет идеального решения, но оно работает. В основном вам необходимо обновить версию базы данных, прежде чем вызывать метод super класса SQLiteOpenHelper (конструктор вашего менеджера баз данных).
`
try
{
String myPath = MyApplication.context.getDatabasePath(DATABASE_NAME).toString();
//open a database directly without Sqliteopenhelper
SQLiteDatabase myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
//if the version is default 0 the update the version
if (myDataBase.getVersion() == 0)
{
//update the database version to the previous one
myDataBase.execSQL("PRAGMA user_version = " + 1);
}
//Close DataBase
myDataBase.close();
}
catch (Exception e)
{
//Do Nothing a fresh install happened
}
`
П.С .: Я знаю, что ответ запоздал, но, возможно, он поможет кому-то вроде меня, который искал именно это решение