Как обрабатывать "миграцию" в базе данных sqlite - PullRequest
1 голос
/ 27 марта 2019

Мне не хватает ясности в том, как обрабатывать миграцию базы данных SQLite, когда пользователь не хочет обновлять приложение, которое включает дополнительные столбцы для обновленного приложения. Как справиться со сбоем и проблемами, возникающими, когда пользователь не хочет обновлять приложение. Любые предложения будут заметны.

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

Как показано ниже при обновлении

       @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int 
         newVersion) {
       switch (oldVersion){
        case 1:
            db.execSQL("ALTER TABLE " + TABLE_GITHUB + " ADD COLUMN " + 
                   NODE_ID + " TEXT ");

        case 2:
            db.execSQL("ALTER TABLE " + TABLE_GITHUB + " ADD COLUMN " + 
                   PRIVATE + " TEXT ");

        case 3:
            db.execSQL("ALTER TABLE GITHUB_DATA ADD COLUMN repos_url 
                   text");
    }
}

Я успешно обновил базу данных SQLite, когда у пользователя была версия SQLite 2, и я сделал это как 3, используя описанный выше метод обновления. Но мне не удалось получить данные, из которых был добавлен столбец (столбца repos_url). Столбец был добавлен в SQLite, но мне не удалось получить данные, хотя у меня есть данные с сервера. Любое предложение будет заметно. Спасибо.

Edit: Учитывая эту ситуацию, если я поддерживаю управление версиями с помощью сервера.

У меня есть repos_url, который мне нужно включить для пользователя новой версии. Это тот адаптер, который мне нужно показать в обзоре переработчика.

@Override
public void onBindViewHolder(@NonNull GithubViewHolder githubViewHolder, int i) {

    HashMap<String,String> hashMap = githubArryaList.get(i);

    githubViewHolder.name.setText(hashMap.get("name"));
    githubViewHolder.fullname.setText(hashMap.get("full_name"));
    githubViewHolder.id.setText(hashMap.get("id"));
    githubViewHolder.node_id.setText(hashMap.get("node_id"));
    githubViewHolder.priv.setText(hashMap.get("private"));

    //new column
    githubViewHolder.repos_url.setText(hashMap.get("repos_url"));

}

И это метод sqlite для отправки данных.

public ArrayList getFavouritesData(){

    ArrayList arrayList = new ArrayList();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_GITHUB,null);

    if (cursor.moveToFirst()){

        do {

            HashMap<String,String> hashMap = new HashMap<>();
            hashMap.put(SqliteFavouriteDatabase.NAME,cursor.getString(cursor.getColumnIndex(SqliteFavouriteDatabase.NAME)));
            hashMap.put(SqliteFavouriteDatabase.FULL_NAME,cursor.getString(cursor.getColumnIndex(SqliteFavouriteDatabase.FULL_NAME)));
            hashMap.put(SqliteFavouriteDatabase.ID,cursor.getString(cursor.getColumnIndex(SqliteFavouriteDatabase.ID)));
            hashMap.put(SqliteFavouriteDatabase.NODE_ID,cursor.getString(cursor.getColumnIndex(SqliteFavouriteDatabase.NODE_ID)));
            hashMap.put(SqliteFavouriteDatabase.PRIVATE,cursor.getString(cursor.getColumnIndex(SqliteFavouriteDatabase.PRIVATE)));
            hashMap.put(SqliteFavouriteDatabase.REPOS_URL,cursor.getString(cursor.getColumnIndex(SqliteFavouriteDatabase.REPOS_URL)));


            arrayList.add(hashMap);

        }while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return arrayList;
}

Вопрос для старой версии, как обрабатывать данные нового столбца. Проблема возникает, когда для старой версии нет столбца с именем repos_url, но я должен использовать repos_url для нового пользователя, и я должен использовать тот же Метод и адаптер для обеих версий (новой и старой). Как справиться с этим для обеих версий. Спасибо

1 Ответ

0 голосов
/ 27 марта 2019

Это обратная совместимость - ваш новый сервер несовместим со старой версией приложения.

Хотя невозможно (или сложно) изменить старую версию приложения, вы можете внести изменения как в новую версию приложения, так и в новую версию сервера, чтобы справиться с этим:

  1. в новой версии приложения, при запросе к серверу добавьте дополнительную информацию, чтобы указать, что это из новой версии приложения
  2. в новой версии сервера, при получении запроса от приложения, проверить, доступна ли дополнительная информация
  3. если доступна дополнительная информация из новой версии приложения, вы можете добавить новые столбцы в ответ
  4. если дополнительная информация недоступна, это из старой версии приложения, вы должны удалить новый столбец в ответе
  5. новая версия приложения получит новые столбцы и обработает
  6. старая версия приложения получит ответ без нового столбца и сможет его обработать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...