一 关于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语句里面写的条件都是用“且”连接,
isNull 和 isNotNull 查询数据库中有无数据,是否为空
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;
//......
}
网友评论