一、GreenDao的介绍

GreenDAO是一个开源的Android ORM(“对象/关系映射”),通过ORM(称为“对象/关系映射”),节省了我们在数据库开发过程的时间!

android greendao插入和更新 安卓greendao_数据库



通过GreenDao,我们可以更快速的操作数据库,我们可以使用简单的面相对象的API来存储,更新,删除和查询Java对象。

GreenDao的优缺点?

1.  高性能

2. 易于使用的强大API,涵盖关系和连接

3. 最小的内存消耗

4. 库大小(<100KB)以保持较低的构建时间并避免65k方法限制

5. 数据库加密:greenDAO支持SQLCipher,以确保用户的数据安全;



GreenDao的核心类

GreenDao的核心类有三个:分别是DaoMaster, DaoSession, XXXDao,这三个类都会自动创建,无需自己编写创建!

  • DaoMaster::DaoMaster保存数据库对象并管理特定模式的DAO类。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。
  • DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。
  • XXXDao:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法。
  • Entities :可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。

二、GreenDao使用方法

1. 导入Gradle插件和Dao代码生成

要在Android项目中使用GreenDao,您需要添加GreenDao Gradle插件并添加GreenDao库:



a). 导入插件



// 在 Project的build.gradle 文件中添加:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}



b). 配置相关依赖



// 在 Moudle:app的  build.gradle 文件中添加:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' // add library
}



c). 配置数据库相关信息



greendao {
    schemaVersion 1 //数据库版本号
    daoPackage 'com.renhui.testapp.functions.database.greenDao.db'
// 设置DaoMaster、DaoSession、Dao 包名
    targetGenDir 'src.main.java'//设置DaoMaster、DaoSession、Dao目录,请注意,这里路径用.不要用/
    generateTests false //设置为true以自动生成单元测试。
    targetGenDirTests 'src/main/java' //应存储生成的单元测试的基本目录。默认为 src / androidTest / java。
}



配置完成,在Android Studio中使用Build> Make Project,重写build项目,GreenDao集成完成!



2. 创建存储对象实体类

使用GreenDao存储数据只需要在存储数据类前面声明@Entity注解就让GreenDao为其生成必要的代码:



@Entity
public class Student {
    @Id(autoincrement = true)
    Long id;
    @Unique
    int studentNo;//学号
    int age; //年龄
    String telPhone;//手机号
    String sex; //性别
    String name;//姓名
    String address;//家庭住址
    String schoolName;//学校名字
    String grade;//几年级
    ……getter and setter and constructor method……
    }



3. GreenDao初始化

我们可以在Application中维持一个全局的会话。我们在Applicaiton进行数据库的初始化操作:=



/**
     * 初始化GreenDao,直接在Application中进行初始化操作
     */
    private void initGreenDao() {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "aserbao.db");
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
    }
    
    private DaoSession daoSession;
    public DaoSession getDaoSession() {
        return daoSession;
    }



初始化完成之后重新rebuild一下项目会发现在设置的targetGenDir的目录生成三个类文件,这个是GreenDao自动生成的!说明数据库已经连接好了,咱们接下来只需要进行数据库的增删改查操作就行了。



4. 使用GreenDao实现增删改查

1. 增

insert() 插入数据



@Override
public void insertData(Thing s) {
    DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
    for (int i = 0; i < 1000; i++) {
        Student student = new Student();
        student.setStudentNo(i);
        int age = mRandom.nextInt(10) + 10;
        student.setAge(age);
        student.setTelPhone(RandomValue.getTel());
        String chineseName = RandomValue.getChineseName();
        student.setName(chineseName);
        if (i % 2 == 0) {
            student.setSex("男");
        } else {
            student.setSex("女");
        }
        student.setAddress(RandomValue.getRoad());
        student.setGrade(String.valueOf(age % 10) + "年纪");
        student.setSchoolName(RandomValue.getSchoolName());
        daoSession.insert(student);
    }
}



insertOrReplace()数据存在则替换,数据不存在则插入



@Override
public void insertData(Thing s) {
    DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
    for (int i = 0; i < 1000; i++) {
        Student student = new Student();
        student.setStudentNo(i);
        int age = mRandom.nextInt(10) + 10;
        student.setAge(age);
        student.setTelPhone(RandomValue.getTel());
        String chineseName = RandomValue.getChineseName();
        student.setName(chineseName);
        if (i % 2 == 0) {
            student.setSex("男");
        } else {
            student.setSex("女");
        }
        student.setAddress(RandomValue.getRoad());
        student.setGrade(String.valueOf(age % 10) + "年纪");
        student.setSchoolName(RandomValue.getSchoolName());
        daoSession.insertOrReplace(student);//插入或替换
    }
}



2. 删

删除有两种方式:delete()和deleteAll();分别表示删除单个和删除所有。



@Override
 public void deleteData(Student s) {
     DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
     daoSession.delete(s);
 }

 @Override
 public void deleteAll() {
     DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
     daoSession.deleteAll(Student.class);
 }



3. 改

通过update来进行修改:



@Override
public void updataData(Student s) {
    DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
    daoSession.update(s);
}



4. 查

查询的方法有:

  • loadAll():查询所有数据。
  • queryRaw():根据条件查询。
  • queryBuilder() : 方便查询的创建,后面详细讲解。
public List queryAll() {
    List<Student> students = daoSession.loadAll(Student.class);
    return students;
}

@Override
public void queryData(String s) {
    List<Student> students = daoSession.queryRaw(Student.class, " where id = ?", s);
    mDataBaseAdapter.addNewStudentData(students);
}