Android 数据库之GreenDAO

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

Android 数据库之GreenDAO_第1张图片

创建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 类 。

 Android 数据库之GreenDAO_第2张图片

定义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 patrolTableList){
        mPatrolTableDao.insertInTx(patrolTableList);
    }

    //查询所有
    public List queryPatrolTable(){
        QueryBuilder query = mPatrolTableDao.queryBuilder()
                .orderAsc(PatrolTableDao.Properties.Id);
        return query.list();
    }

    //查询地块名称
    public List queryMassif(String massifName){
        QueryBuilder query = mPatrolTableDao.queryBuilder();
        query = query.where(PatrolTableDao.Properties.PatrolerMassif.eq(massifName))
                .orderAsc(PatrolTableDao.Properties.Id);;
        return query.list();


    }

    //查询巡查人员
    public List queryPerson(String personName){
        QueryBuilder 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 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 allPatrolTables = instance.queryPatrolTable();
        Gson gson2 = new Gson();
        String json2 = gson2.toJson(allPatrolTables);
        System.out.println("JSON2"+json2);

    }

你可能感兴趣的:(android,数据库)