Почему onUpgrade () не вызывается в базе данных Android sqlite? - PullRequest
16 голосов
/ 04 октября 2011

Я хочу обновить базу данных, когда она установлена ​​на моем эмуляторе Android.Я установил версию db в моем DbHelper, которая наследуется от SQLiteOpenHelper, равной +1новее.Однако это никогда не называется.Мне интересно, есть ли что-то, чего мне не хватает.Где хранится версия, которую использует DbHelper для сравнения с новой версией?Почему это не работает?

Я на самом деле копирую базу данных из папки ресурсов в папку данных, а не заново создаю схему.

Ответы [ 4 ]

28 голосов
/ 25 июля 2012

Это фрагмент кода из источника SQLiteOpenHelper.getWritableDatabase():

int version = db.getVersion();
if (version != mNewVersion) {
    db.beginTransaction();
    try {
        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();
    }
}

onOpen(db);

Как видите, onCreate() или onUpgrade() вызываются в рамках вызова на getWritableDatabase().Вы должны использовать эти вызовы всякий раз, когда вам нужен экземпляр SQLiteDatabase.Вы не должны использовать свои собственные методы, кроме случаев, когда они являются обертками для метода getWritableDatabase или getReadableDatabase.

12 голосов
/ 12 октября 2011

Документация говорит:

База данных фактически не создается и не открывается до тех пор, пока не будет вызвана одна из функций getWritableDatabase () или getReadableDatabase ().

Я вижу, что вы реализовали свои собственные методы получения базы данных: openDataBaseForRead() и openDataBaseForWrite(). Это плохо; -)

3 голосов
/ 19 ноября 2015

Я понял проблему. Эта проблема возникает только при копировании БД из активов. БД в папке активов имеет версию по умолчанию 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
   }

`

П.С .: Я знаю, что ответ запоздал, но, возможно, он поможет кому-то вроде меня, который искал именно это решение

0 голосов
/ 16 ноября 2018

В моем случае версия базы данных в папке ресурсов и текущая версия базы данных в коде, обе одинаковые, позже я увеличил текущую версию базы данных в коде, затем вызывается метод onUpgrade.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...