GreenDao3.2.2集成和基本使用

GreenDao3.2.2集成和基本使用

官方git网址:greenrobot/greenDAO

  • 优点:一个精简的库;性能最大化;最小的内存开销;易于使用的 APIs;支持数据库加密;依赖体积小;强大的社区支持。

集成方式

  1. 在项目的根build.gradle文件里:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}

2.在项目app的build.gradle文件里:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin 

android {
    ...
}

greendao {
    schemaVersion 1 // 数据库版本号
    daoPackage '如:包名.greendao' //greenDao 自动生成的代码保存的包名
    targetGenDir 'src/main/java' //自动生成的代码存储的路径,默认是 build/generated/source/greendao.
//    generateTests false //true的时候自动生成测试单元
//    targetGenDirTests: 测试单元的生成目录默认是 src/androidTest/java
}


dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' // add library
}

3.创建数据库实体类Bean:

@Entity
public class UserInfo {
    @Id
    private Long id;
    private String name;
    private int age;
    @Generated(hash = 577950320)
    public UserInfo(Long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    @Generated(hash = 1279772520)
    public UserInfo() {
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return this.age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

注意:实体类文件只需要写好变量名,get和set方法是build后自动生成的

  • 实体@Entity注解:
    schema:告知GreenDao当前实体属于哪个schema
    active:标记一个实体处于活跃状态,活动实体有更新、删除和刷新方法
    nameInDb:在数据库中使用的别名,默认使用的是实体的类名
    indexes:定义索引,可以跨越多个列
    createInDb:标记创建数据库表
  • 基础属性注解:
    @Id:主键 Long 型,可以通过@Id(autoincrement = true)设置自增长
    @Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name")
    @NotNull:设置数据库表当前列不能为空
    @Transient:添加此标记后不会生成数据库表的列
  • 索引注解
    @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
    @Unique:向数据库添加了一个唯一的约束
  • 关系注解
    @ToOne:定义与另一个实体(一个实体对象)的关系
    @ToMany:定义与多个实体对象的关系
  1. 编写还实体类后,点击Build->Make Project,Build完成后 ,会在之前配置的 greenDao 自动生成的代码的指定目录下生成以下三个文件
  • DaoMaster
  • DaoSession
  • UserInfoDao

初始化GreenDao

一般建议在Application中初始化数据库

public class MyAplication extends Application {
    private static APPAplication context;
    public static APPAplication getApplication(){
        return context;
    }

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        context=this;
    
        setDataBase();
    }

    private static final String DATA_BASE_NAME="test-db";
    private void setDataBase() {
        mHelper=new DaoMaster.DevOpenHelper(this,DATA_BASE_NAME,null);
        db=mHelper.getWritableDatabase();
        mDaoMaster=new DaoMaster(db);
        mDaoSession=mDaoMaster.newSession();
    }

    public DaoSession getDaoSession(){
        return mDaoSession;
    }
    public SQLiteDatabase getDb(){
        return db;
    }

}

UserInfoDao infoDao=MyAplication.getApplication().getDaoSession().getUserInfoDao();
        //add
        for (int i=0;i<10;i++){
            if (infoDao.queryBuilder().where(UserInfoDao.Properties.Name.eq("小米"+i)).unique()==null){
            //判断名字是否已存在
                UserInfo userInfo1=new UserInfo(null,"小米"+i,(i*2));
                infoDao.insert(userInfo1);
            }

        }

  • deleteBykey(Long key) :根据主键删除一条记录。
  • delete(UserInfo entity) :根据实体类删除一条记录,一般结合查询方法,查询出一条记录之后删除。
  • deleteAll(): 删除所有记录
UserInfoDao infoDao=MyAplication.getApplication().getDaoSession().getUserInfoDao();

infoDao.deleteByKey(1L);//通过Long型ID删除数据

  • update(UserInfo entity):更新一条记录
UserInfoDao infoDao=MyAplication.getApplication().getDaoSession().getUserInfoDao();

infoDao.update(new UserInfo(1L,"小名",20));

  • loadAll():查询所有记录
  • load(Long key):根据主键查询一条记录
  • queryBuilder().list():返回:List
  • queryBuilder().where(UserDao.Properties.Name.eq("")).list():返回:List
  • queryRaw(String where,String selectionArg):返回:List
UserInfoDao infoDao=MyAplication.getApplication().getDaoSession().getUserInfoDao();

//查询姓名为:‘小米5’的数据
List list=infoDao.queryBuilder().where(UserInfoDao.Properties.Name.eq("小米5")).build().list();

缓存问题

  • 当修改更新某一条数据后,重新查询会发现查找出来的数据依然是未修改前的数据,这是因为Greendao到数据查询是带缓存的查询,你搜索过的数据会生成缓存,查询的时候会先查询缓存,这样可以节约资源,提高效率,但是也由此产生一些问题,所以此时需要先清除缓存,在做查询操作。
    可以通过以下代码清除缓存 后再做查询操作
//清除所有数据库缓存
daoSession.clear()
//MyAplication.getApplication().getDaoSession().clear();


//清空指定某个数据表缓存
//MyAplication.getApplication().getDaoSession().getUserInfoDao().detachAll();

你可能感兴趣的:(GreenDao3.2.2集成和基本使用)