Обновление базы данных не работает-Android - PullRequest
3 голосов
/ 29 апреля 2011

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

Проблема в том, что функция OnUpdate () в SQLiteOpenHelper никогда не вызывается. Вот код, который я написал в основном упражнении -

    SharedPreferences DB_ver = getSharedPreferences(PREFS_NAME, 0);
    myDbHelper = new DataBaseHelper(con, DB_ver.getInt("DB_ver", 1));
    try {
        if(DB_ver.getInt("DB_ver", 1) !=getPackageManager().getPackageInfo(getPackageName(), 0).versionCode )
        {
              SharedPreferences.Editor editor = DB_ver.edit();
              editor.putInt("DB_ver", getPackageManager().getPackageInfo(getPackageName(), 0).versionCode);
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }

Вот конструктор SQLiteOpenHelper (который расширяет SQLiteOpenHelper) -

public DataBaseHelper(Context context,int ver_code) {       
    super(context, DB_NAME, null, ver_code);
    this.myContext = context;
}   

Теперь я понял, что линия Super должна автоматически вызывать функцию onUpgrade (), но это не так.

Я протестировал функцию onUpgrade () отдельно, и она работает.

Кто-нибудь знает в чем проблема?

Спасибо!

Ответы [ 4 ]

1 голос
/ 29 апреля 2011

То, что вы делаете, на самом деле не обязательно.SQLiteOpenHelper делает все, что вам нужно.Вот возможный сценарий.SQLiteOpenHelper имеет метод getVersion () на тот случай, если вам нужно запросить его в один момент (я никогда не делал):

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

  private static final String dbname = "whatever";
  private static final int    dbversion = 1;  // your first version
//private static final int    dbversion = 2;  // your second version
//private static final int    dbversion = 3;  // your third version

  public MySQLiteOpenHelper(Context context) {
    super(context, dbname, null, dbversion);
    this.context = context;
  }

  @Override
  public void onCreate(SQLiteDatabase sqliteDatabase) {
    // ... Create first database content
  }

  @Override
  public void onUpgrade(SQLiteDatabase sqliteDatabase, int oldVersion, int newVersion) {
    switch (newVersion) {
      case dbversion:  // suppose your on third version
        if (oldVersion == 1) {
          upgradeFrom1To2(sqliteDatabase);
          upgradeFrom2To3(sqliteDatabase);
        }

        if (oldVersion == 2) {
          upgradeFrom2To3(sqliteDatabase);
        }

        break;
      default:
        break;
    }
  }

  public void upgradeFrom1To2(SQLiteDatabase sqliteDatabase) {
    // ...
  }

  public void upgradeFrom2To3(SQLiteDatabase sqliteDatabase) {
    // ...
  }
}
1 голос
/ 29 апреля 2011

Две вещи:

  1. Вы не звоните editor.commit().
  2. Вы создаете базу данных с начальным значением версии 1 в этом коде.Если вы не меняете номер версии в AndroidManifest.xml, он никогда не будет ничем иным, как 1. Пока эта версия не изменится, onUpgrade() вызывать не нужно.onCreate() вызывается при первом создании базы данных, но onUpgrade() вызывается только в том случае, если сообщаемая версия становится другой.
1 голос
/ 29 апреля 2011

Вы должны изменить целое число "VERSION", чтобы ваш onUpgrade вызывался.

Кроме того, onUpgrade получает два целых числа, первое - это текущая версия базы данных (обновление с), второе -версия, которую вы обновляете до.

0 голосов
/ 29 апреля 2011

Одна вещь, которую я вижу, это то, что вы не фиксируете свои изменения в SharedPreferences, которые вы открываете.Вам нужно позвонить editor.commit ();сохранить изменения в SharedPreferences.

Кроме того, вы пытались открыть базу данных в режиме чтения или записи?

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