Android 数据库之GreenDAO

news2024/11/27 2:19:49

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);

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dy六神参数记录分析(立秋篇)

version&#xff1a; 23.9 X-SSSTUB: 搜索&#xff1a;x-tt-dt var hashMap Java.use("java.util.HashMap");hashMap.put.implementation function (a, b) {console.log("hashMap.put: ", a, b);return this.put(a, b);}https://codeooo.blog.csdn.n…

分享一下Steam搬砖常规操作

大家好&#xff0c;我是阿阳&#xff0c;接下来我们会陆续更新一些Steam搬砖项目的操作课程&#xff0c;大家可以自行学习&#xff0c;希望对正在操作的朋友&#xff0c;有一定的帮助。 steam平台&#xff0c;对于大多数游戏玩家应该再清楚不过了&#xff0c;玩过pubg&#xf…

资深测试老鸟整理,性能测试-常见调优详细,卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 常见的一些性能缺…

【数据结构】单链表OJ题

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;数据结构 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、移除链表元素 &#x1f4a1;方法一&#xff1a; &#x1f4a1;方法二…

活动发布会邀请媒体6步走

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体参加活动发布会对信息的传播&#xff0c;企业品牌建设有诸多的好处&#xff0c;今天就与大家分享下邀请媒体参加活动报道的6个步骤&#xff1a; 1. 策划与准备&#xff1a; -明…

南卡携手傅园慧,破圈背后开辟了全新营销方法

南卡官宣了&#xff01;新品牌大使是傅园慧&#xff01;在极短时间内&#xff0c;该消息迅速登上各平台热搜&#xff0c;并且在抖音等社交平台上也引起了强烈的共振。 一直以来&#xff0c;耳机行业由于本身经营的是耐消品&#xff0c;因此在推广大使的选择上始终持谨慎且保守的…

山东布谷科技直播系统源码热点分析:不同芯片实现高质量编码与渲染视频的GPU加速功能

在现代科技的迅猛发展下&#xff0c;直播系统源码平台被开发搭建出来&#xff0c;为人们的生活方式带来了很大的改变&#xff0c;直播系统源码平台的好友、短视频、直播、社区等功能让很多人越来越热衷于去在平台上刷视频、看直播、分享生活。用户的喜爱也督促了直播系统源码平…

【EI/SCOPUS征稿】第三届电子通信与计算机科学技术国际学术会议(ECCST 2023)

第三届电子通信与计算机科学技术国际学术会议&#xff08;ECCST 2023&#xff09; 2023 3rd International Conference on Electronic Communication,Computer Science and Technology 2023年电子通信与计算机科学技术国际学术会议定于2023年9月15-17日在中国上海举行。会议旨…

opencv基础-34 图像平滑处理-双边滤波cv2.bilateralFilter()

双边滤波&#xff08;BilateralFiltering&#xff09;是一种图像处理滤波技术&#xff0c;用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同&#xff0c;双边滤波在考虑像素之间的空间距离之外&#xff0c;还考虑了像素之间的灰度值相似性。这使得双边滤波能够有…

MyBatis简介及环境配置

文章目录 一、什么是MyBatis二、MyBatis开发环境配置1.创建数据库表2.添加MyBatis框架支持3.配置连接字符串和MyBatis4.添加业务代码流程 一、什么是MyBatis MyBatis是一种持久层框架&#xff0c;也是一种ORM框架&#xff08;Object Relational Mapping即对象关系映射&#xf…

SSM个人博客项目

文章目录 SSM个人博客系统实现项目介绍 一、准备工作0. 创建项目添加对应依赖1. 数据库设计2. 定时实体类 二、功能实现1.统一功能处理统一返回格式统一异常处理定义登录拦截器 2. 注册登录实现生成获取验证码密码加盐实现注册功能登录功能注销功能 3.登录用户博客列表获取登录…

提取字符串标签中的文字js

DOM操作&#xff1a; const extractText (str) > {const parser new DOMParser();const doc parser.parseFromString(str, text/html);const textNodes doc.body.innerText.trim().split(\n);return textNodes; };const input <div>提取文字</div><p>…

合思动态:合思商城上新「中转联程」功能

引言&#xff1a;正如合思创始人兼 CEO马春荃强调&#xff0c;面对各个行业对财务数字化有差异化需求&#xff0c;费控企业需要深入扎根细分行业探索多元化版本和解决方案&#xff0c;并根据行业实时需求快速迭代。合思的使命就是云产品服务的创新&#xff0c;实现降本增效、合…

基于STM32设计的出租车计费系统

一、项目介绍 在城市交通中&#xff0c;出租车是一种常见的交通工具。为了方便乘客和司机之间的交易&#xff0c;出租车计费系统被广泛应用于出租车行业。系统能够自动计算乘客的费用&#xff0c;提供准确、方便的计费服务&#xff0c;并且能够记录乘客的行驶数据&#xff0c;…

IDEA 指定spring.profiles.active本地启动

spring.profiles.activedev spring.profiles.activepro

SpringBoot项目配置文件

文章目录 一、配置文件作用二、配置文件格式三、properties配置文件说明基本语法读取配置文件优缺点 四、yml配置文件说明基本语法使用yml连接数据库使用yml配置不同数据类型及nullyml配置的读取配置字符串的单双引号问题配置对象 两种格式配置文件对比properties格式配置文件示…

Keburnetes YAML配置文件管理

Kubernetes 支持 YAML 和 JSON 格式管理资源对象JSON 格式&#xff1a;主要用于 api 接口之间消息的传递YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 YAML 语法格式 大小写敏感使用缩进表示层…

Linux之AWK

目录 Linux之AWK 定义 语法格式 常用选项 awk 变量 内置变量 格式 案例 &#xff08;1&#xff09;编写一个文本名字叫做awkdemo&#xff0c;里面内容如下 &#xff08;2&#xff09;FS指定输入分隔符 &#xff08;3&#xff09;OFS指定输出分隔符 &#xff08;4&#xf…

EditText设置inputType=“textPassword“后hint 英文字体不对,而且不能换行

问题如题,我先上图看下遇到的问题 ( ps: 我只想唱一句 : 你这该死的安卓~~ 让我心在痛 累在流!!!) 很明显字体偏大,字间隔很宽,关键还不会换行, 看一下我们需要的效果: 看到只要把 android:inputType"textPassword" 这一行干掉 一切就是我们想要的,但是产…