如何在sqlite数据库中处理“迁移”

问题描述 投票:1回答:1

当用户不想更新包含更新应用程序的附加列的应用程序时,我忽略了如何处理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时,我成功升级了SQLite数据库,并在升级方法上使用上述内容将其设为3。但我无法获取我添加的列(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为新用户时,我必须使用相同的方法和适配器对于这两个版本(新旧)。如何处理这两个版本。谢谢

android sqlite
1个回答
0
投票

这是向后兼容性 - 您的新服务器与旧版本的应用程序不兼容。

虽然修改旧版本的应用程序是不可能(或很难)的,但您可以在新版本的应用程序和新版本的服务器上进行更改以处理此问题:

  1. 在新版本的应用程序中,当请求提交到服务器时,添加额外信息以指示这是来自新版本的应用程序
  2. 在新版本的服务器中,当从应用程序接收请求时,检查是否有额外信息可用
  3. 如果有额外的信息,它来自新版本的应用程序,您可以在响应中添加新列
  4. 如果没有额外的信息,它来自旧版本的应用程序,您应该删除响应中的新列
  5. 新版本的应用程序将收到新的列和句柄
  6. 旧版本的应用程序将收到没有新列的响应,并能够处理。
© www.soinside.com 2019 - 2024. All rights reserved.