本文最后更新于:星期四, 六月 18日 2020, 9:01 上午

首先,这玩意怎么升级数据库?

  1. 传统SQLite语句做法:
    写一个自己的Helper继承自SQLiteOpenHelper,重写里面的onUpgrade方法,方法里做的事情就是(如图):
  • 先把原先的表drop下来,就是删了
  • 然后再重新创建)然后拿helper的时候就用的自己的Helper就完事了,接着这里第四个参数就是数据库版本号,填一个比之前大的数字就OK了。
  1. GreenDao:
    问题:greendao里面没有那种指定版本号就升级的方法,摸索之后如下:

    在这里更改数据库版本,然后点击make project,下次安装的时候就升级了~

然而,默认情况下GreenDao升级数据库也是会直接drop掉table,那样数据就全部清空了!!!

  • 解决方法如下:
    借鉴github上面一个开源项目:GreenDaoUpgradeHelper

    按照作者的思路走就很简单了,以下是实践起来的步骤:

1.在根目录的build.gradle文件的repositories内添加如下代码:

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2.添加依赖(greendao 3.0及以上)

dependencies {
        compile 'org.greenrobot:greendao:3.2.0'
        compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.0.0'
}
  1. 自己建一个Helper类继承OpenHelper:

    public class MyDataBaseHelper extends DaoMaster.OpenHelper {
     public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
         super(context, name, factory);
     }
     //这里重写onUpgrade方法
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
             @Override
             public void onCreateAllTables(Database db, boolean ifNotExists) {
                 DaoMaster.createAllTables(db, ifNotExists);
             }
    
             @Override
             public void onDropAllTables(Database db, boolean ifExists) {
                 DaoMaster.dropAllTables(db, ifExists);
             }
             //注意此处的参数StudentDao.class,很重要(一开始没注意,给坑了一下),它就是需要升级的table的Dao,
             //不填的话数据丢失,
             // 这里可以放多个Dao.class,也就是可以做到很多table的安全升级,Good~
         }, StudentDao.class);
     }
    }
  2. 记得这里的OpenHelper要用刚才自己写的那个。

大功告成,然后每次要升级就去改gradle的schemaVersion就是了。

稳了稳了~~


Android     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

JSONObject,JSONArray解析 上一篇
Generate-Signed-APK的一个坑 下一篇