美文网首页
GreenDao3.0数据库的简单使用

GreenDao3.0数据库的简单使用

作者: Active_Loser | 来源:发表于2018-01-18 14:10 被阅读0次

一 关于GreenDao

greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。关于greenDAO的概念可以看官网greenDAO,greendao其性能和效率远胜于ORMLite与Xutils。GreenDao的诞生简化了我们的SQLite操作,使得访问数据库变得如此简单
GreenDao 3采用注解的方式来定义实体类,通过gradle插件生成相应的代码。


二 GreenDao的配置

关于greendao更加详细的配置介绍,以及其最新版本和特性,请移步:GitHub
在根目录的build.gradle文件中添加:

dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
    classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
allprojects {
    repositories {
        jcenter()
        mavenCentral() //添加存储库,注意添加的位置
    }
}

在应用module下的build.gradle文件:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' // add library
}

自定义路径,在app的gradle文件中配置数据库信息:

greendao {
    schemaVersion 1
    daoPackage 'com.anye.greendao.gen'
    targetGenDir 'src/main/java'
}

属性介绍:
schemaVersion--> 指定数据库schema版本号,迁移等操作会用到;
daoPackage --> dao的包名,包名默认是entity所在的包;
targetGenDir --> 生成数据库文件的目录;


三 Greendao的使用

关于greendao的使用,会创建一个简单的例子方便回顾

3.1 创建数据库表

首先我们创建一个java bean,这里我们创建一个学生表。

@Entity
public class Student {
    @Id
    private Long id;
    private String name;//姓名
    private String age;//年龄
    private int classes;//班级
}

创建完成后,点击AS菜单栏上的锤子(Make Project),greendao会帮我们自动生成数据库表,创建数据库表需要注释:
@Entity 标识实体类,GreenDao会映射成sqlite中的一个表
@Id 标识主键
@Transient 标识该属性将不会映射到表中,也就是没有这列,不存储在数据库中
@Property 用于设置属性在数据库中的列名(默认不写就是保持一致)
@NotNull 非空
@Unique 唯一约束
@ToMany 一对多
@OrderBy 排序
我们通常会使用以上注释,更多注释,大家可以查看:GreenDao注释帮助文档

3.2 创建数据库

3.2.1 创建数据库

我们在MyApplication中创建数据,记得在AndroidManifest.xml中声明android:name=".app.MyApplication"

public class MyApplication extends Application {
    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    public static MyApplication instances;
    @Override    public void onCreate() {
        super.onCreate();
        instances = this;
        setDatabase();
    }
    public static MyApplication getInstances(){
        return instances;
    }
    /**
     * 设置greenDao
     * 通过 DaoMaster 的内部类 DevOpenHelper,创建一个名为person_db的数据库
     * 通过getWritableDatabase()得到一SQLiteOpenHelper 对象。
     */
    private void setDatabase() {
        mHelper = new DaoMaster.DevOpenHelper(this, "person_db", null);
        db = mHelper.getWritableDatabase();
        //该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }
    //获取DaoSession 
    public DaoSession getDaoSession() {
        return mDaoSession;
    }
   //获取db
    public SQLiteDatabase getDb() {
        return db;
    }
}

3.2.2 获取表对象

mStudentDao= MyApplication.getInstances().getDaoSession().getStudentDao();

3.3 数据操作

3.3.1 插入数据

(1)插入单条数据

mStudentDao.insert(new Student((long)1, "小明" ,30, 1));

(2)插入List集合

List<Student> studentList = new ArrayList<>();
studentList.add(new Student((long) 2, "小红" , 20, 2));
studentList.add(new Student((long)3, "小花",26, 1));
studentList.add(new Student((long) 4, "小王", 39, 2));

mStudentDao.insertInTx(studentList);

插入数据有三种方式,根据实际情况选择:
insert:会因为id重复出现异常,可使用下面2个方法进行插入
insertOrReplace : 传入的对象在数据库中,有则更新无则插入。推荐同步数据库时使用该方法。
save: 类似于insertOrReplace,区别在于save会判断传入对象的key,有key的对象执行更新,无key的执行插入。当对象有key但并不在数据库时会执行失败.适用于保存本地列表

3.3.2 删除数据

(1)根据key删除

 mStudentDao.deleteByKey((long)1);

(2)根据查询到的对象进行删除

 Student student = mStudentDao.queryBuilder().where(StudentDao.Properties.Id.eq(1)).build().unique();
 mStudentDao.delete(student);

(3)删除所有数据

 mStudentDao.deleteAll();

3.3.3 更新数据

(1)直接更新

 mStudentDao.update(new Student((long) 2, "王华", 30, 2));

(2)查询出对象,修改在更新

Student student = mStudentDao.queryBuilder().where(StudentDao.Properties.Id.eq(2)).build().unique();
student.setName("李华");
mStudentDao.update(student);

(3) 更新多条数据

List<Student> studentList = new ArrayList<>();
  mStudentDao.updateInTx(studentList );

3.3.4 查询数据

简单查询
loadAll()即可查询数据库中所有数据

条件查询
我们通常使用条件查询查询我们需要的数据,条件查询通常会用到一下两种
whereOr:whereOr里的语句使用“或”连接
where: where语句里面写的条件都是用“且”连接,
isNullisNotNull 查询数据库中有无数据,是否为空
unique()返回唯一数据,list()返回集合数据

distinct直接过滤掉重负字段
limit 分页n个一页,一般和offset结合使用
offset 忽略查询出的前n条结果
orderAsc以字段升序排序
orderDesc以字段降序
preferLocalizedStringOrder 本地化字符串排序
orderCustom 自定义排序 里面需要传两个参数: 一个属性 和对应的排序方案 ASC 或是 DESC
orderRaw 也是自定义排序, 把字段和 排序方案 写在一个字符串传入
stringOrderCollation 也是自定义排序 可以合并多个升降排序方案 以日期升序 且 价格降序
eq相等
notEq和eq相反
notIn 同上
or 或者
like 模糊查询
between可以取两个值的区间
gt相当于 >
ge相当于 >=
lt相当于 <
le相当于 <=
简单实例

//查询以降序排列,然后,姓名红hany“姓名1”且姓名部位“姓名11”的用户,用户ID需要大于12的用户
List<Student> students12 =mStudentDao.queryBuilder()
    .orderDesc(StudentDao.Properties.Id)
    .whereOr(StudentDao.Properties.Name.like("%姓名1%"), StudentDao.Properties.Name.notEq("姓名11"))
    .where(StudentDao.Properties.Id.gt(12))
    .build().list();

四、多变关联查询

常用的两张

一对一

关键字:ToOne
举例:每个班级学生对应一个班主任

本帖旨做于笔记整理,项目源码GreenDao

@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    private int age;
    private int classes;
    private Long teaherid;//这是与头关联的外键
    @ToOne(joinProperty = "teaherid")//这个是注解绑定 hid就是上面一行的teaherid
    private Teacher teacher;//对象,无需赋值
    //....
}
@Entity
public class Teacher {
    @Id
    private Long id;
    private String name;
    private int clsases;

    //......
}

查询

studentDb.getName()+studentDb.getTeacher().getName()

一对多

关键字:ToMany
举例:每个老师对应班上的很多学生

@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    private int age;
    private int classes;
    private Long teaherid;//这是与头关联的外键
    @ToOne(joinProperty = "teaherid")//这个是注解绑定 hid就是上面一行的teaherid
    private Teacher teacher;//对象,无需赋值
    //....
}
@Entity
public class Teacher {
    @Id
    private Long id;
    private String name;
    private int clsases;
    @ToMany(referencedJoinProperty = "teaherid")////指定与之关联的其他类的id,也就是学生对象中的老师id
    private List<StudentDb>studentDbs;

    //......
}

相关文章

网友评论

      本文标题:GreenDao3.0数据库的简单使用

      本文链接:https://www.haomeiwen.com/subject/scceoxtx.html