GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化,最小的内存开销 、依赖体积小 同时还是支持 数据库加密。
greenDAO 官网地址:greenrobot.org/greendao/
greenDAO GitHub 源码地址:greenrobot/greenDAO
GreenDao 特征
1、支持 protocol buffer(protobuf) 协议
GreenDao 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射
2、代码生成
greenDAO 会根据配置信息自动生成核心管理类以及 DAO 对象
3、性能
所有 ORM 数据库的,greenDAO 是最快的,greenDAO 不作性能方面任何妥协
核心类介绍
1、DaoMaster:
使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),我们可以通过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 创建不同模式的 SQLite 数据库。
2、DaoSession :
管理指定模式下的所有 DAO 对象,DaoSession 提供了一些通用的持久性方法比如插入、负载、更新和删除实体。
3、XxxDAO :
对于每个实体类, greenDAO 都会生成一个与之对应 DAO 对象,如:User 实体,则会生成一个 UserDao 类
4、Entities:
可持久化对象。通常,实体对象代表一个数据库行,使用标准 Java 属性(如一个 POJO 或 JavaBean )
集成GreenDao
1、build.gradle(Module:app)中添加配置与依赖
(1)
apply plugin: 'org.greenrobot.greendao' //添加greendao apply plugin
android {
*
*
}
(2)
android {
*
*
// greendao配置
greendao {
//数据库版本号,升级时修改
schemaVersion 1
//生成的DAO,DaoMaster和DaoSession的包路径。默认与表实体所在的包路径相同
daoPackage 'com.chy.greendao'
//生成源文件的路径。默认源文件目录是在build目录中的(build/generated/source/greendao)
targetGenDir 'src/main/java'
}
}
(3)
//引入GreenDao数据库,存储数据
implementation 'org.greenrobot:greendao:3.3.0' // add library
//Gson依赖
implementation 'com.google.code.gson:gson:2.8.5'
2、build.gradle(Project:xxx)中添加配置
// 添加插件 更好支持GreenDao
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
创建Myapplication类:
public class Myapplication extends Application {
public static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
initDb();
}
/**
* 数据库初始化
* */
public void initDb () {
// 获取SQLiteOpenHelper对象devOpenHelper
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "mydb.db");
// 获取SQLiteDatabase
SQLiteDatabase db = devOpenHelper.getWritableDatabase();
// 加密数据库(这句话无法运行)
//Database database = devOpenHelper.getEncryptedWritableDb("12345");
//DaoMaster daoMaster = new DaoMaster(database);
// 创建DaoMaster实例
// DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类(而不是对象)。
// 它具有静态方法来创建表或将它们删除。
// 其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。
DaoMaster daoMaster = new DaoMaster(db);
// 管理特定模式的所有可用Dao对象
daoSession = daoMaster.newSession();
}
}
在AndroidManifest.xml添加自定义的Myapplication
创建Entity
package com.chy.table;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Property;
import org.greenrobot.greendao.annotation.Generated;
@Entity(nameInDb = "patrol_table")
public class PatrolTable {
/**
* 主键 Long型,可以通过@Id(autoincrement = true)设置自增长。
* 通过这个注解标记的字段必须是Long,数据库中表示它就是主键,并且默认是自增的。
*/
@Id(autoincrement = true)
private Long id;
/**
* Unique 属性给数据库的列添加了一个唯一性限制。注意,SQLite也会隐式地为它创建一个索引。
* Property :属性指定数据库的字段名称。默认是驼峰转成大写的下划线隔开的名称,比如:UserAge 转成 USER_AGE
*/
// @Unique
@Property(nameInDb = "patroler_massif")
private String patrolerMassif;// 巡查地块
@Property(nameInDb = "patroler_person")
private String patrolerPerson;// 巡查人员
@Property(nameInDb = "patroler_time")
private String patrolerTime;// 巡查时间
@Generated(hash = 2022133330)
public PatrolTable(Long id, String patrolerMassif, String patrolerPerson,
String patrolerTime) {
this.id = id;
this.patrolerMassif = patrolerMassif;
this.patrolerPerson = patrolerPerson;
this.patrolerTime = patrolerTime;
}
@Generated(hash = 824963258)
public PatrolTable() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getPatrolerMassif() {
return this.patrolerMassif;
}
public void setPatrolerMassif(String patrolerMassif) {
this.patrolerMassif = patrolerMassif;
}
public String getPatrolerPerson() {
return this.patrolerPerson;
}
public void setPatrolerPerson(String patrolerPerson) {
this.patrolerPerson = patrolerPerson;
}
public String getPatrolerTime() {
return this.patrolerTime;
}
public void setPatrolerTime(String patrolerTime) {
this.patrolerTime = patrolerTime;
}
}
创建完entity,点击Make Project 如图所示:
如果配置正确,会在配置的包目录下自动会生成DaoMaster,DaoSession 和XXXDao 类 。
定义GreenDaoManager类:
/**
* 自定义Manager
* */
public class GreenDaoManager {
private Context mContext;
private PatrolTableDao mPatrolTableDao;
// 构造函数
private GreenDaoManager(Context context){
mContext = context;
mPatrolTableDao = Myapplication.daoSession.getPatrolTableDao();
}
/**
* 单例
* */
private static GreenDaoManager INSTANCE;
public static GreenDaoManager getInstance(Context context){
if (INSTANCE == null){
INSTANCE = new GreenDaoManager(context);
}
return INSTANCE;
}
//添加一条数据到数据库
public long insertPatrolTable (PatrolTable patrolTable) {
long flag = mPatrolTableDao.insertOrReplace(patrolTable);
return flag;
}
// 批量插入数据
public void insertPatrolTables(List<PatrolTable> patrolTableList){
mPatrolTableDao.insertInTx(patrolTableList);
}
//查询所有
public List<PatrolTable> queryPatrolTable(){
QueryBuilder<PatrolTable> query = mPatrolTableDao.queryBuilder()
.orderAsc(PatrolTableDao.Properties.Id);
return query.list();
}
//查询地块名称
public List<PatrolTable> queryMassif(String massifName){
QueryBuilder<PatrolTable> query = mPatrolTableDao.queryBuilder();
query = query.where(PatrolTableDao.Properties.PatrolerMassif.eq(massifName))
.orderAsc(PatrolTableDao.Properties.Id);;
return query.list();
}
//查询巡查人员
public List<PatrolTable> queryPerson(String personName){
QueryBuilder<PatrolTable> query = mPatrolTableDao.queryBuilder();
query = query.where(PatrolTableDao.Properties.PatrolerPerson.eq(personName))
.orderAsc(PatrolTableDao.Properties.Id);
return query.list();
}
//删除指定数据
public void deletePatrolTable(PatrolTable patrolTable){
mPatrolTableDao.delete(patrolTable);
}
//更新数据
public void updatePatrolTable(PatrolTable patrolTable){
mPatrolTableDao.update(patrolTable);
}
}
使用:
private void initDB(){
GreenDaoManager instance = GreenDaoManager.getInstance(this);
//创建数据
PatrolTable patrolTable = new PatrolTable();
patrolTable.setPatrolerPerson("张三");
patrolTable.setPatrolerMassif("南湖公园");
patrolTable.setPatrolerTime("2023-8-8 11:21");
/** 添加数据 **/
long flag = instance.insertPatrolTable(patrolTable);
System.out.println(flag);
/** 获取数据 **/
List<PatrolTable> patrolTables = instance.queryMassif(patrolTable.getPatrolerMassif());
Gson gson = new Gson();
String json = gson.toJson(patrolTables);
System.out.println("JSON"+json);
/** 修改数据 **/
PatrolTable updatePatrolTable = new PatrolTable();
updatePatrolTable.setId(1l);
updatePatrolTable.setPatrolerPerson("李四");
updatePatrolTable.setPatrolerMassif("西湖公园");
updatePatrolTable.setPatrolerTime("2023-8-10 11:21");
instance.updatePatrolTable(updatePatrolTable);
/**
* 获取所有数据
* */
List<PatrolTable> allPatrolTables = instance.queryPatrolTable();
Gson gson2 = new Gson();
String json2 = gson2.toJson(allPatrolTables);
System.out.println("JSON2"+json2);
}