GreenDao简介
GreenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM数据库框架,本文将讲解如何集成GreenDao3.0环境,如何使用GreenDao自动生成代码及注解的使用。GreenDao GitHub
GreenDao3.0优势
GreenDao相较于ORMLite等其他数据库框架有以下优势:
1. 一个精简的库
2. 性能最大化
3. 内存开销最小化
4. 易于使用的 APIs
5. 对 Android 进行高度优化
而GreenDao3.0的版本主要使用注解方式定义实体类,通过gradle插件生成相应的代码。
//根gradle
classpath'org.greenrobot:greendao-gradle-plugin:3.2.2'
//app gradle在最上方
applyplugin: 'org.greenrobot.greendao'
//放在android{}里面
greendao {
schemaVersion 1 //数据库版本号
daoPackage'com.example.greendaotest.database' //设置时生成代码的目录
targetGenDir 'src/main/java' //设置DaoMaster、DaoSession、Dao目录
}
//添加app依赖
dependencies{
compile 'org.greenrobot:greendao:3.2.2'
}
public class GreenDaoUtils {
private static DaoSession daoSession;
private static volatile GreenDaoUtils instance;
public static void initGreenDao(Context context){
daoSession = DaoMaster.newDevSession(context,"class.db");
}
public static DaoSession getDaoSession(){
return daoSession;
}
public class App extends Application{
@Override
public void onCreate() {
super.onCreate();
GreenDaoUtils.initGreenDao(this);
}
}
package com.bwie.skn.greendao;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import com.bwie.skn.greendao.database.DaoSession;
import com.bwie.skn.greendao.database.StudentDao;
import com.bwie.skn.greendao.database.TeacherDao;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
private DaoSession daoSession;
private TeacherDao teacherDao;
private StudentDao studentDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
daoSession = GreenDaoUtils.getDaoSession();// 调用到数据库
teacherDao = daoSession.getTeacherDao();//调用数据库中的teacher表
studentDao = daoSession.getStudentDao();//调用数据库中的student表
}
@OnClick({R.id.add, R.id.delete, R.id.update, R.id.query})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.add:
//添加数据到数据库
Teacher teacherCang = new Teacher(null, "苍老师", 22);
Teacher teacherBo = new Teacher(null, "波老师", 23);
Teacher teacherWu = new Teacher(null, "武老师", 24);
teacherDao.insertInTx(teacherCang,teacherBo,teacherWu);
Student studentFan = new Student(null,"范杰",17,teacherCang.getId());
Student studentSheng = new Student(null,"张东升",18,teacherCang.getId());
Student studentLu = new Student(null,"卢旷行",19,teacherBo.getId());
Student studentFei = new Student(null,"张鹏飞",17,teacherWu.getId());
Student studentFeng = new Student(null,"冯少岩",17,teacherWu.getId());
studentDao.insertInTx(studentFan,studentSheng,studentLu,studentFei,studentFeng);
break;
case R.id.delete:
//查询数据,然后删除查到的数据
//当然也可以直接删除数据
//同时可以直接清空表 **Dao.deleteAll();
Student studentF = studentDao.queryBuilder()
.where(StudentDao.Properties.Name.eq("张鹏飞"))
//只会查询出一个,如果数据库有多个的话,会抛异常
.unique();
studentDao.delete(studentF);
break;
case R.id.update:
//修改数据库,先查询数据库然后修改查到的数据
Teacher teacherUpadte = teacherDao.queryBuilder()
.where(TeacherDao.Properties.Name.eq("武老师"))
//只会查询出一个,如果数据库有多个的话,会抛异常
.unique();
teacherUpadte.setAge(22);
teacherDao.update(teacherUpadte);
break;
case R.id.query:
//查询表
Teacher teacherQuery = teacherDao.queryBuilder()
.where(TeacherDao.Properties.Name.like("武老师"))
//只会查询出一个,如果数据库有多个的话,会抛异常
.unique();
List students = studentDao.loadAll();
Log.e("queay","TEACHER::姓名:"+teacherQuery.getName()+"::年龄:"+teacherQuery.getAge()+"----STUDENT_ALL:"+students.size());
break;
}
}
}
类注解
@Entity( schema = "myschema", active = true, nameInDb ="AWESOME_USERS", createInDb = true )
@Entity:用于标识当前实体需要GreenDao生成代码。
schema:项目中存在多个Schema时,表明当前实体属于哪个Schema。
active:标记实体是否处于活动状态,活动状态才支持更新删除刷新等操作。
nameInDb:存储在数据库中的表名,不写默认与类名一致。
createInDb:标记创建数据库表,若有多个实体关联此表可设为false避免重复创建,默认为true。
属性注解
@Id :主键Long型,可以通过@Id(autoincrement= true)设置自增长。
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名例如@Property (nameInDb="name")。
@NotNul:设置数据库表当前列不能为空。
@OrderBy:指定排序。
@Transient:添加此标记之后不会生成数据库表的列。
@Generated:为build之后GreenDao自动生成的注解,为防止重复,每一块代码生成后会加个hash作为标记。
------------
@ToMany:定义与多个实体对象一对多的关联,referencedJoinProperty为外键约束。
Query
主键
load(Longkey)
loadAll()
查询
Query query= employeeDao.queryBuilder() .where(**.Properties.**.eq(**), **.Properties.**.ge(**)) .build();
子线程查询
privatevoid queryThread() { final Queryquery = **Dao.queryBuilder().build(); new Thread(){ @Override public void run() { List list =query.forCurrentThread().list(); } }.start(); }
查询条件判断
eq,noteq与like查询
l eq判断值是否相等
l noteq与eq相反,判断值是否不等,通常用来模糊查找,返回指定类型的集合。
l like相当于通配符查询,包含查询值的实体都会返回,同样模糊查找,返回指定类型的集合。
>、<、>=、<=查询
分别对应方法: >:gt() <: lt() >=: ge() <=: le()
isNull与isNotNull
为空与不为空,判断数据库中有无数据。
排序
对查询结果进行排序,有升序与降序。
List<**> list = **Dao.queryBuilder().where(***) .orderAsc(**Dao.Properties.**) .list();
删除
**Dao.deleteAll()
**Dao.deleteBykey(Long key)
**Dao.delete(对象)
更新
//修改属性 对象.set**() //进行更新 **Dao.update(对象);