GreenDao 3.0的基本用法以及正确的数据库版本升级

1: Gradle配置

在项目根目录中的build.gradle和主model(app)工程下的build.gradle分别加入如下配置:

dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
greendao {
    schemaVersion 5 //数据库版本号
    daoPackage 'com.gx.greendao' //设置DaoMaster.DaoSession,Dao包名
    targetGenDir 'src/main/java' //设置daoPackage所在的文件路径
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.android.support:recyclerview-v7:27.1.0'
    implementation 'com.android.support:support-v4:27.1.0'
    compile 'com.android.support:design:27.1.0'
   
    implementation 'org.greenrobot:greendao:3.2.2' // add library

}

2: 项目实战运用

新建User的java实体类,如下:

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    private String name;
    private int age;
    private String pic;
    private String content;
}

然后执行Build->Make Model app ,会自动根据配置在项目中对应的com.gx.greendao目录下生成DaoMaster``DaoSession``UserDao三个文件

image.png

在项目的application中完成相应的初始化操作,如下:

 private String DATA_BASE_NAME = "GxDb";
    private static DaoSession mDaoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        setUpDataBase(this);
    }

    private void setUpDataBase(Context context) {
        DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, DATA_BASE_NAME);
        Database db = openHelper.getWritableDb();
        DaoMaster daoMaster = new DaoMaster(db);


        mDaoSession = daoMaster.newSession();
    }

    public static DaoSession getDaoSession() {
        return mDaoSession;
    }

增删改查操作:

               //插入
                User user = new User(null, "GexYY" + new Random().nextInt(100), new Random().nextInt(40) + 20,"content","csd");
                mUserDaoSession.getUserDao().insert(user);
                mQueryBtn.performClick();
              
                //删除
                mUserDaoSession.getUserDao().deleteByKey(1l);
                mQueryBtn.performClick();
    
                //更新
                User user1 = mUserDaoSession.getUserDao().load(1l);
                if (user1 != null) {
                    user1.setName("GexYY_Update");
                    mUserDaoSession.getUserDao().update(user1);
                }
               
                //查询
                List<User> userList = mUserDaoSession.getUserDao().loadAll();
                StringBuilder builder = new StringBuilder();
                for (User entity : userList) {
                    builder.append(entity.toString()).append("\n");
                }
                mContent.setText(builder.toString());
               

3: 数据库升级

GreenDao默认帮我们处理来升级操作,只需要在build.gradle中修改一下schemaVersion版本号即可

但是我们查看DaoMaster.DevOpenHelper的代码中的onUpgragde()方法如下:

 @Override
        public void onUpgrade(Database db, int oldVersion, int newVersion) {
            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
            dropAllTables(db, true);
            onCreate(db);
        }

发现每次升级都是把老的数据库删除掉,包括数据,然后再重新创建相关的数据库和表,这样就导致了数据库升级之后数据的丢失.
那么如何保证升级后数据的不丢失呢?
这里就用到了一个大神写的MigrationHelper
https://stackoverflow.com/questions/13373170/greendao-schema-update-and-data-migration/30334668#30334668
使用方法如下:

@Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        if (oldVersion < newVersion) {
            DbBackUpHelper.getInstance().migrate(db, UserDao.class);
        }
    }

但是由于DaoMaster.DevOpenHelper是编译自动生成的,所以不建议直接在其里边去实现,这样每次编译都会把相关代码还原删除,
我们应该自定义一个openHelper,并继承'DaoMaster.DevOpenHelper',如下:

public class DbOpenHelper extends DaoMaster.DevOpenHelper {
    public DbOpenHelper(Context context, String name) {
        super(context, name);
    }

    public DbOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
       //切记不要调用super.onUpgrade(db,oldVersion,newVersion)
        if (oldVersion < newVersion) {
            DbBackUpHelper.getInstance().migrate(db, UserDao.class);
        }
    }
}

切记不要调用super.onUpgrade(db,oldVersion,newVersion),不然依然会删除数据记录

然后在修改一下初始化地方的代码如下:

private void setUpDataBase(Context context) {
        DbOpenHelper openHelper = new DbOpenHelper(context, DATA_BASE_NAME, null);
        Database db = openHelper.getWritableDb();
        DaoMaster daoMaster = new DaoMaster(db);
        mDaoSession = daoMaster.newSession();
    }

到此,GreenDao的数据库升级就优化结束,并且能正常保留表数据!

关于实体的相关注解,请参考http://www.cnblogs.com/zhujiabin/p/9288492.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348