• 数据库框架之GreenDao
  • 添加GreenDao
  • 创建Bean与常用注解
  • 初始化GreenDao
  • 增删改查
  • 插入数据
  • 查询数据
  • 更新数据
  • 删除数据
  • 测试结果


数据库框架之GreenDao

在我们开发项目中,经常需要涉及到数据库的使用,目前比较流行的开源项目也很多,今天要介绍主角的就是其中之一,GreenDao
Github项目地址:

添加GreenDao

首先我们需要将GreenDao添加到我们的项目中,本文使用的Ide是Android Studio。在当前的Project以及Module中的gradle中配置如下参数:

//配置在当前Project的gradle下:
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

//配置在当前的Module的gradle下:
apply plugin: 'org.greenrobot.greendao'

dependencies {
    compile 'org.greenrobot:greendao:3.2.0'
}

//指定生成的Dao文件的位置
greendao {
    targetGenDir 'src/main/java'
}

创建Bean与常用注解

文本介绍的GreenDao是基于3.2.0版,GreenDao在更新到3.+版本之后也引入通过注解的方式来定义实体类,之后通过AS构建项目后,通过Gradle插件会自动帮我们生成相关的Dao文件,下面会介绍一些常用的注解的用法。

首先创建一个实体类:

@Entity
public class Person{

    @Id(autoincrement = true)
    private Long id;

    @Property(nameInDb = "USERNAME")
    @NotNull
    private String name;

    @Property(nameInDb = "USERAGE")
    @NotNull
    private int age;

    @NotNull
    private String sex;
}
  • 实体类相关:

@Entry:

指定在相应的数据库中生成对应的表

  • 属性相关:

@Id

创建表中的主键,可以通过autoincrement = true来设置主键自动增长。

@Property

对应该属性在表中的列的字段的名字,可以通过(nameInDb = "USERNAME")来设定其中的名字,如果不设置,默认的话就是该属性的名字。

@NotNull

表示表中的该属性的值不能为null

创建完Entry类之后,我们通过gradle编译之后,就会在上面指定的位置生成相应的实体类文件以及Dao文件。

初始化GreenDao

对于数据库的操作,都是通过刚刚生成的Dao文件的实例来进行操作的,因此首先我们需要进行初始化,实例代码如下,之后我么就可以通过personDao实例对数据库进行操作了。

private PersonDao personDao;

private void initDao(){
        LhyLogger.getInstance().setDebugEnable(true);
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "lhy.db", null);
        DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDb());
        DaoSession daoSession = daoMaster.newSession();
        personDao = daoSession.getPersonDao();
    }

增删改查

针对数据库的操作不外乎增删改查,下面我们分别进行如下操作,涉及到对文件进行操作首先不要忘记在Manifest中声明相应的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

插入数据

我们自定义2个方法,分别可以插入单条数据以及多条数据:

/**
     * 插入多条数据
     *
     * @param personDao
     * @param users
     */
    private void insertUser2DB(PersonDao personDao, List<Person> users){
        for(int i = 0; i < users.size(); i++){
            personDao.insert(users.get(i));
        }
    }

    /**
     * 插入单条数据
     *
     * @param personDao
     * @param user
     */
    private void insertUser2DB(PersonDao personDao, Person user){
        personDao.insert(user);
    }

查询数据

查询数据是通过QueryBuilder来构建的,查询条件可以通过where/or/and方法添加,比如我们需要查询单个数据的话,查询Id主键为0的数据:

Person p = personDao.queryBuilder().where(PersonDao.Properties.Id.eq(0)).build().unique();

查询多条数据的话,可以通过list()方法

List<Person> p = personDao.queryBuilder().where(PersonDao.Properties.Name.eq("LHY")).build().list();

不添加搜索条件查询全部:

//查询所有数据
    private List<Person> queryALL(){
        List<Person> list = personDao.queryBuilder().list();
        return list;
    }

更新数据

更新某条数据的话,首先需要查询到这个数据,实例代码如下:将所有符合条件的人的年龄修改,调用的是update()方法。

/**
     * 修改数据内容
     *
     * @param personDao
     * @param name
     */
    private void updateUserInfo(PersonDao personDao, String name){
        List<Person> persons = personDao.queryBuilder().where(PersonDao.Properties.Name.eq(name)).build().list;
        if(null != persons){
            for(Person person : persons){
                person.setAge(1000);
                personDao.update(person);
                String resultSucc = ("修改数据成功, ID:" + person.getId());
                //                Toast.makeText(this, resultSucc, Toast.LENGTH_SHORT).show();
                LhyLogger.getInstance().d(this, resultSucc);
            }
        }else{
            String errorInfo = "该用户不存在";
            Toast.makeText(this, errorInfo, Toast.LENGTH_SHORT).show();
            LhyLogger.getInstance().d(this, errorInfo);
        }
    }

删除数据

删除数据与修改类似,首先都需要查询到数据,然后通过delete()方法,实例代码如下:

/**
     * 删除数据
     *
     * @param personDao
     * @param personName
     */
    private void deleteUser(PersonDao personDao, String personName){
        List<Person> persons = personDao.queryBuilder().where(PersonDao.Properties.Name.eq(personName)).build().list();
        if(null != persons){
            for(Person person : persons){
                personDao.delete(person);
                String resultSucc = ("删除成功: ID: " + person.getId() + " personName: " + person.getName() + "; personAge: " + person.getAge());
                LhyLogger.getInstance().d(this, resultSucc);
            }
        }else{
            String errorInfo = "该用户不存在";
            Toast.makeText(this, errorInfo, Toast.LENGTH_SHORT).show();
            LhyLogger.getInstance().d(this, errorInfo);
        }
    }

测试结果

首先为了测试,我们先直接插入20条数据:

然后插入一条新的数据:

接着对其进行修改,我们发现修改成功:

接下来我们执行删除操作,为了演示,多添加了几条数据,可以看到成功删除: