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;@Overridepublic void onCreate() {super.onCreate();initDb();}/*** 数据库初始化* */public void initDb () {
//        获取SQLiteOpenHelper对象devOpenHelperDaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "mydb.db");
//        获取SQLiteDatabaseSQLiteDatabase 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.mzph.cn/news/28413.shtml

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

相关文章

IPWorks S3 Delphi Edition Crack

IPWorks S3 Delphi Edition Crack IPWorksS3使集成基于云的文件存储变得容易。易于使用的组件可用于与任何S3兼容的存储提供商集成&#xff0c;如Amazon S3、Digital Ocean Spaces、Wasabi、Backblaze B2、IBM Cloud Object storage、Oracle Cloud、Linode等。强大的客户端加密…

springboot+vue智能化网络电子相册图片管理系统_84ds3

随着计算机技术发展&#xff0c;计算机系统的应用已延伸到社会的各个领域&#xff0c;大量基于网络的广泛应用给生活带来了十分的便利。所以把智能化电子相册与现在网络相结合&#xff0c;利用计算机搭建智能化电子相册系统&#xff0c;实现智能化电子相册的信息化。则对于进一…

01_什么是ansible、基本架构、ansible工作机制、Ansible安装、配置主机清单、设置SSH无密码登录等

1.什么是ansible 1.1.基本介绍 1.2.基本架构 1.3.基本特征 1.4.优点 1.5.ansible工作机制 2.Ansible安装 2.1.机器准备 2.2.安装ansible 2.2.1.安装epel源 2.2.2.安装ansible 2.2.3.查看ansible版本 2.2.4.树状结构展示文件夹 2.2.4.1.其中ansible.cfg的内容如下 2.2.4.2.host的…

jmeter 二次开发详解

目录 背景&#xff1a; 自定义 BeanShell 功能 自定义请求编写&#xff08;Java Sampler&#xff09; 实现 Java Sampler 功能的两种方式 案例&#xff1a;使用 JavaSampler 重写 HTTP 的 POST 请求 自定义函数助手 背景&#xff1a; JMeter 是一个功能强大的性能测试工具…

The ‘kotlin-android-extensions‘ Gradle plugin is no longer supported.

Android使用kotlin开发&#xff0c;运行报错 The kotlin-android-extensions Gradle plugin is no longer supported. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.an…

linux umask 详解

1. umask 定义 在 linux 系统中&#xff0c;umask 被定义在 /etc/profile 配置文件中&#xff0c;有一段 shell 脚本对 umask 是这么定义的。在 shell 会话输入命令&#xff1a; $ cat /etc/profile # 查看 /etc/profile 配置文件的内容 if [ $UID -gt 199 ] &&…

Vue3中v-model在原生元素和自定义组件上的使用

目录 前言 一、原生元素上的用法 1. 输入框(input) 2. 多行文本域(textarea) 3. 单选按钮(radio) 4. 多选框(checkbox) 5. 下拉选择框(select) 二、自定义组件上的用法 1. 定义一个名为 modelValue 的 props 属性和一个名为 update:modelValue 的事件 2.使用一个可…

网络编程 tcp udp http编程流程 网络基础知识

讲解 网络基础知识网络编程tcp编程流程图示理解bind和accept函数理解监视套接字和链接套接字理解linux和window下的编程实现tcp特点 udp编程流程图示理解udp特点 http编程流程图示理解编程实现-网站服务器 网络基础知识 OSI分层&#xff1a;应用层 表示层 会话层 传输层 网络层…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

【MongoDB】解决ProxmoxVE下CentOS7虚拟机安装MongoDB6后启动失败的问题

目录 安装步骤&#xff1a; 2.1 配置yum源 2.2 安装MongoDB 2.3 启 动MongoDB ProxmoxVE上新装的CentOS7.4虚拟机&#xff0c;安装MongoDB6。 安装步骤&#xff1a; 2.1 配置yum源 # 创建mongodb yum源&#xff08;https://www.mongodb.com/docs/manual/tutorial/insta…

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…

【Vue3】插槽全家桶

插槽&#xff08;Slots&#xff09;是 Vue.js 框架中的一个功能&#xff0c;允许在组件内部预留一些可替换的内容。通过插槽&#xff0c;可以给父组件填充模板代码&#xff0c;让父组件向子组件传递自定义的内容&#xff0c;以便在子组件中进行展示或处理。 1. 匿名插槽 Son.…

初次使用GPU云服务器

前言&#xff1a; 在体验了GPU云服务器&#xff08;GPU Cloud Computing&#xff0c;GPU&#xff09;后&#xff0c;我认为这是一个非常强大的弹性计算服务。它为深度学习、科学计算、图形可视化、视频处理等多种应用场景提供了强大的GPU算力&#xff0c;能够满足各类用户的计算…

【动态规划】数字三角形

算法提高课课堂笔记。 文章目录 摘花生题意思路代码 最低通行费题意思路代码 方格取数题意思路代码 摘花生 题目链接 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道…

UML—浅谈常用九种图

目录 概述: 1.用例图 2.静态图 3.行为图&#xff1a; 4.交互图&#xff1a; 5.实现图&#xff1a; 概述: UML的视图是由九种视图组成的&#xff0c;分别是用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、实施图。我们可以根据这9种图的功能和实现的目的…

RocketMQ发送消息超时异常

说明&#xff1a;在使用RocketMQ发送消息时&#xff0c;出现下面这个异常&#xff08;org.springframework.messging.MessgingException&#xff1a;sendDefaultImpl call timeout……&#xff09;&#xff1b; 解决&#xff1a;修改RocketMQ中broke.conf配置&#xff0c;添加下…

枫叶时代:打造中国特色的传统文化IP

近年来&#xff0c;取材于传统文化的影视作品在文化产业市场受到前所未有的关注。作为一种兼具辨识度、影响力和流量变现能力的文化符号&#xff0c;影视IP既是文化产业的一个重要环节&#xff0c;也是国家文化软实力的直接体现。优秀的影视IP可以超越文字、语言、民族的障碍&a…

滑动窗口(全面清晰/Java)

数组模拟单调队列 分析 以k3举例&#xff1a; (1)利用单调队列的性质&#xff1a; <1>最小值&#xff1a;确保队列单调递增&#xff0c;处理后&#xff0c;队头即是最小值。 <2>最大值&#xff1a;确保队列单调递减&#xff0c;处理后&#xff0c;队头即是最大值…

做接口测试如何上次文件

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

yolov2检测网数据集标注_labelme使用_json2txt格式转换

yolov2检测网数据集标注_labelme使用_json2txt格式转换 一、安装Anaconda二、创建labelme虚拟环境三、使用labelme标注健康非健康猫狗数据3.1 打开数据集所在文件夹3.2 进行标注数据集3.3 json2txt3.4 按文件目录和训练测试数据集重分配 四、数据喂给服务器网络参考链接 一、安…