之前用过用过ActiveAndroid用久了发现使用起来还是不怎么方便,于是找到了GreenDao这个ORM框架
为啥选这GreenDao
- 性能较于其他ORM框架有明显优势,内存占用小
- 文档完善
GreenDao官方文档
GreenDao参考API - 流行度高
占据GitHub ORM排行第一(技术的东西随大流还是可以的)
GitHub ORM框架 - 使用简单
- 拓展性强,可配置高级功能
如何使用基本的GreenDao
1. 在project的build.gradle中添加依赖
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
===== 1号坑 =====
出现上述情况,是因为GreenDao所需要的gradle的最低版本是3.3
解决方法:
法①:
选择Use local gradle distribution
把gradle的版本最低升级到3.3,如果没有请到https://services.gradle.org/distributions/下载
下载完解压放在本地gradle目录
法②:
选择Use default gradle wrapper,然后修改gradle-wrapper.properties文件
===== 2号坑 =====
!!! classpath 'com.android.tools.build:gradle:2.3.0'这里注意使用自己的Android Studio Gradle插件版本
2. 在moudle的build.gradle中添加依赖
apply plugin: 'org.greenrobot.greendao' // apply plugin
compile 'org.greenrobot:greendao:3.2.2' // add library
3. 在moudle的build.gradle中定义GreenDao代码生成的路径
greendao {
schemaVersion 1 //数据库版本号,后期需要升级数据库,这里版本号必须增加
daoPackage 'com.sam.greendao.gen' //Dao代码生成在这个包中
targetGenDir 'src/main/java' //包位于这个路径下
}
4.通过简单的注解,编写Entity实体类
@Entity //代表这是一个数据库隐射的实体类
public class Student
{
@Id //实体类的唯一标识,数据类型只能是long的
private long id;
private String name;
}
注:这里不需要自己去生成get(),set()方法
更多注解请查看http://greenrobot.org/greendao/documentation/modelling-entities/
5. Build->Make Module '你的moudle名'
GreenDao自动生成一下几个类
6.初始化数据库
//初始化数据库
private void initDB()
{
//创建Person_db数据库
DaoMaster.DevOpenHelper person_db = new DaoMaster.DevOpenHelper(MainActivity.this, "Person_db", null);
DaoMaster daoMaster = new DaoMaster(person_db.getWritableDb());
//实例一个操作seeeion
DaoSession daoSession = daoMaster.newSession();
//获得Student表的数据访问对象
studentDao = daoSession.getStudentDao();
}
7. 增 ---插入数据
//插入数据
private void insertDB()
{
//实例化一个实体,相当于数据表里面的一条记录
student_a = new Student(111, "伞兵一号");
student_b = new Student(222, "伞兵二号");
student_c = new Student(333, "吃鸡");
//插入数据库
studentDao.insert(student_a);
studentDao.insert(student_b);
studentDao.insert(student_c);
}
注:创建对象的时候id不能重复
用sqlite工具查看一下,数据插入成功
这边的rowid是行记录的物理位置id不用管它
8. 查 ---查询数据
- 查询所有数据
//查询表中所有数据
private void queryAllDB()
{
List<Student> list = studentDao.queryBuilder().list();
for (Student student:list)
{
Log.e("queryAllDB: ",student.toString() );
}
}
- 条件查询
//条件查询数据
private void queryDB()
{
List<Student> list = studentDao.queryBuilder().where(StudentDao.Properties.Name.like("%伞%")).list();
for (Student student:list)
{
Log.e("queryDB: ",student.toString() );
}
}
GreenDao还提供一系列查询语句,如下
===== 3号坑 =====
!!!特别注意:如果是通过懒加载查询LazyList<Student> list = studentDao.queryBuilder().where(StudentDao.Properties.Name.like("%伞%")).listLazy();
来查询的话要记得调用lazyListlist.close()避免内存泄漏,listLazyUncached()和listIterator()也必须调用close()方法
9. 改 ---修改数据
//修改数据
private void updateDB()
{
//查询到name='吃鸡'的Student
Student student = studentDao.queryBuilder().where(StudentDao.Properties.Name.eq("吃鸡")).build().unique();
//修改name字段
student.setName("大吉大利,今晚吃鸡");
//update数据
studentDao.update(student);
}
10. 删 ---删除数据
//修改数据
private void deleteDB()
{
//查询到name='大吉大利,今晚吃鸡'的Student
Student student = studentDao.queryBuilder().where(StudentDao.Properties.Name.eq("大吉大利,今晚吃鸡")).build().unique();
//删除数据
studentDao.delete(student);
}
11. GreenDao获得Cursor对象
DBUserDao userDao = daoSession.getDBUserDao();
QueryBuilder<DBUser> queryBuilder = userDao.queryBuilder().where(DBUserDao.Properties.Phone_number.eq("XYZ"));
Cursor cursor = queryBuilder.buildCursor().query();