Android数据库GreenDao的使用

Android 平台上的数据库框架是非常多的,但是有一个共同特点就是基于对象关系映射模型的。实现的目标也都是不需要写 SQL 语句,通过对对象的操作保存和操作数据。

GreenDao3.2的使用

gradle配置

在主项目(Project)的build.gradle中添加依赖

dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

在模块(Module)的build.gradle中添加依赖

greendao {
    schemaVersion 版本号
    daoPackage '生成数据库类的包名'
    targetGenDir 'src/main/java'
}
 
dependencies {
	implementation 'org.greenrobot:greendao:3.2.0'
}

创建Bean对象(表名和字段名)


@Entity
public class Test{
 
    //必须要有且为Long类型
    @Id(autoincrement = true)
    private Long id;
    private String name;

}

注解说明:

创建实体之后点击Buile–Make Preject就会在我们配置的包名下生成数据库文件主要有DaoMaster、DaoSession、实体Dao三个文件。

初始化数据库


public class MyApplication extends Application {
 
    private static DaoSession daoSession;
 
    @Override
    public void onCreate() {
        super.onCreate();
        //配置数据库
        setupDatabase();
    }
 
    /**
     * 配置数据库
     */
    private void setupDatabase() {
        //创建数据库
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "Test.db", null);
        //获取可写数据库
        SQLiteDatabase db = helper.getWritableDatabase();
        //获取数据库对象
        DaoMaster daoMaster = new DaoMaster(db);
        //获取Dao对象管理者
        daoSession = daoMaster.newSession();
    }
 
    public static DaoSession getDaoInstant() {
        return daoSession;
    }
}

使用数据库

使用增删改查
MyApplication.getDaoInstant().getTestDao.insert(Test);
MyApplication.getDaoInstant().getTestDao.delete(Test);
MyApplication.getDaoInstant().getTestDao.update(Test);
MyApplication.getDaoInstant().getTestDao.loadAll();

条件查询  (查询name为张三的数据)
MyApplication.getDaoInstant().getTestDao.queryBuilder().where(TestDao.Properties.Name.eq("张三")).list();
关键字 说明
whereOr whereOr里的语句使用“或”连接
where where语句里面写的条件都是用“且”连接
orderDesc 以字段降序
orderAsc 以字段升序排序
.limit() 查询限制当页个数
offset 忽略查询出的前n条结果
eq 值相同
notEq 值不同
like 模糊查询
gt 相当于 >
ge 相当于 >=
lt 相当于 <
le 相当于 <=
isNull 为空
notIsNull 不为空
count 查询总个数

数据库升级

每次修改数据库实体后都要重新编译一下才能生效,但是如果设备上已存在旧版数据库就会报错,需要修改数据库版本号才能正常使用,但是会覆盖旧版的数据库,会导致旧版数据丢失,那么如何在旧版数据库的基础上修改表的字段还保留旧版数据呢。这里使用一个第三方框架GreenDaoUpgradeHelper(greenDao的数据库升级帮助类),使用它可以很容易解决数据库升级问题。

在配置Greendao的build中添加配置:

implementation 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.1.0'

创建一个新类继承DaoMaster.OpenHelper添加构造函数并实现onUpgrade方法,在onUpgrade方法升级代码即可,参数为所有的Dao类:

public class DbOpenHelper extends DaoMaster.OpenHelper {

    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(SQLiteDatabase db, int oldVersion, int newVersion) {
        //把需要管理的数据库表DAO作为最后一个参数传入到方法中
        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);
            }
        },  TestDao.class);

    }
}

这样就可以在不清除覆盖旧版数据库的基础上升级数据库了,那么修改初始化方法如下,使用方法不变:

public class MyApplication extends Application {
 
    private static DaoSession daoSession;
 
    @Override
    public void onCreate() {
        super.onCreate();
        //配置数据库
        setupDatabase();
    }
 
    /**
     * 配置数据库
     */
    private void setupDatabase() {
       DbOpenHelper helper = new DbOpenHelper(this, "test.db", null);
       daoSession = new DaoMaster(helper.getWritableDatabase()).newSession();
    }
 
    public static DaoSession getDaoInstant() {
        return daoSession;
    }
}