【发布时间】:2022-03-17 22:46:19
【问题描述】:
当用户不想更新包含已更新应用的附加列的应用时,我错过了如何处理 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版本2并使用上面的升级方法使其成为3时,我成功升级了SQLite数据库。但是我未能从我添加的列(repos_url 列)中获取数据。该列已添加到 SQLite,但尽管我有来自服务器的数据,但我无法获取数据。任何建议都将是可观的。谢谢。
编辑: 考虑到这种情况如果我使用服务器维护版本控制。
我有 repos_url,我需要为新版本用户包含它。这是我需要在 recyclerview 中显示的适配器。
@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 并且我必须使用相同的列时,就会出现问题两个版本(新旧)的方法和适配器。如何处理这两个版本。谢谢
【问题讨论】:
-
您好,当您说“我无法获取数据”时,您的意思是您插入了一个带有
repos_url值的新行,但是当您选择它时它是空的? -
如果用户不想更新应用程序,那么您必须为他们的应用程序维护一个单独的 API/应用程序版本。 sqlite 不支持您的用例。
-
@PozzoApps 我已经从服务器获得了 repos_url 的值,同时我已经使用上面的升级方法更新了 SQLite 表列。该表已添加,但当我从 SQLite.db 文件中检查时,repos_url 的值为 null
-
@kkarakk 是的,你是对的,我有同样的想法来维护 api 的版本控制,但如何维护 sqlite 列。我已经在 sqlite db 中添加了 sqlite 列。这不会是一个问题对于不升级应用程序的用户。我们使用向 getData() 发送数据的方法,我添加了新列 (repos_url)。
-
好的,在这种情况下,您需要接受旧应用版本不会有新列。