Мне не хватает ясности в том, как обрабатывать миграцию базы данных 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 для нового пользователя, и я должен использовать тот же Метод и адаптер для обеих версий (новой и старой). Как справиться с этим для обеих версий. Спасибо