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);}
相关文章:
Android 数据库之GreenDAO
GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化,…...
kotlin 编写一个简单的天气预报app(六)使用recyclerView显示forecast内容
要使用RecyclerView显示天气预报的内容 先在grandle里添加recyclerView的引用 implementation androidx.recyclerview:recyclerview:1.3.1创建一个RecyclerView控件:在布局文件中,添加一个RecyclerView控件,用于显示天气预报的列表。 这是一…...
jpa Page 1 of 0 containing UNKNOWN instances错误关于like问题的解决记录
导致这个问题的原因很多,这里记录一下我碰到的问题和解决方法。 网上有说时 pageNo要从0开始,我的不是这个问题。 在使用springboot jpa时,发现使用 t.ip like %?5% 语句,如果数据库记录的ip is null时,将查询不到该…...
Python实战之使用Python进行数据挖掘详解
一、Python数据挖掘 1.1 数据挖掘是什么? 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过算法,找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言,拥有丰富的数据挖掘库&#…...
scala 加载properties文件
利用java.util.Properties加载 import java.io.FileInputStream import java.util.Properties object LoadParameter {//动态获取properties文件可配置参数val props new Properties()def getParameter(s:String,filePath:String): String {props.load(new FileInputStream(f…...
备战秋招012(20230808)
文章目录 前言一、今天学习了什么?二、动态规划1.概念2.题目 总结 前言 提示:这里为每天自己的学习内容心情总结; Learn By Doing,Now or Never,Writing is organized thinking. 提示:以下是本篇文章正文…...
QT中定时器的使用
文章目录 概述步骤 概述 Qt中使用定时器大致有两种,本篇暂时仅描述使用QTimer实现定时器 步骤 // 1.创建定时器对象 QTimer *timer new QTimer(this);// 2.开启一个定时器,5秒触发一次 timer->start(5000); // 3.建立信号槽连接&am…...
【UE4】多人联机教程(重点笔记)
效果 1. 创建房间、搜索房间功能 2. 根据指定IP和端口加入游戏 步骤 1. 新建一个第三人称角色模板工程 2. 创建一个空白关卡,这里命名为“InitMap” 3. 新建一个控件蓝图,这里命名为“UMG_ConnectMenu” 在关卡蓝图中显示该控件蓝图 打开“UMG_Connec…...
【go】GIN参数重复绑定报错EOF问题
文章目录 1 问题描述2 解决:替换为ShouldBindBodyWith 1 问题描述 在 Gin 框架中,当多次调用 ShouldBind() 或 ShouldBindJSON() 方法时,会导致请求体的数据流被读取多次,从而出现 “EOF” 错误。 例如在api层绑定了参数&#x…...
关于MySQL中的binlog
介绍 undo log 和 redo log是由Inno DB存储引擎生成的。 在MySQL服务器架构中,分为三层:连接层、服务层(server层)、执行层(存储引擎层) bin log 是 binary log的缩写,即二进制日志。 MySQL…...
我维护电脑的方法
无论是学习还是工作,电脑都是IT人必不可少的重要武器,一台好电脑除了自身配置要经得起考验,后期主人对它的维护也是决定它寿命的重要因素! 你日常是怎么维护你的“战友”的呢,维护电脑运行你有什么好的建议吗ÿ…...
AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动
产品描述 AP51656是一款连续电感电流导通模式的降压恒流源,用于驱动一颗或多颗串联LED 输入电压范围从 5 V 到 60V,输出电流 可达 1.5A 。根据不同的输入电压和 外部器件, 可以驱动高达数十瓦的 LED。 内置功率开关,采用电流采样…...
Python爬虫的解析(学习于b站尚硅谷)
目录 一、xpath 1.xpath插件的安装 2. xpath的基本使用 (1)xpath的使用方法与基本语法(路径查询、谓词查询、内容查询(使用text查看标签内容)、属性查询、模糊查询、逻辑运算) (2&a…...
python的virtualenv虚拟环境无法激活activate
目录 问题描述: 解决办法: 解决结果: 问题描述: PS D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts> .\activate .\activate : 无法加载文件 D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts\…...
uniapp中token操作:存储、获取、失效处理。
实现代码 存储token:uni.setStorageSync(token, res.data.result);获取token:uni.getStorageSync(token);清除token:uni.setStorageSync(token, ); 应用场景 在登录操作中,保存token pwdLogin() {....this.$axios.request({url: .....,method: post,p…...
乐鑫科技 2022 笔试面试题
岗位:嵌入式软件实习生。 个人情况:本科双非电子信息工程,硕士华五软件工程研一在读;本科做过一些很水的项目 ,也拿项目搞了一些奖,相对来说嵌入式方向比较对口。 时间线及面试流程 2021.04.02 笔试 题目分为选择题和编程题,选择题二十题,编程题两题; 选择题基本…...
实现UDP可靠性传输
文章目录 1、TCP协议介绍1.1、ARQ协议1.2、停等式1.3、回退n帧1.4、选择性重传 1、TCP协议介绍 TCP协议是基于IP协议,面向连接,可靠基于字节流的传输层协议 1、基于IP协议:TCP协议是基于IP协议之上传输的,TCP协议报文中的源端口IP…...
Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动地区金融平等
流支付正在成为一种全新的支付形态,Zebec Protocol 作为流支付的主要推崇者,正在积极的推动该支付方案向更广泛的应用场景拓展。目前,Zebec Protocol 成功的将流支付应用在薪酬支付领域,并通过收购 WageLink 将其纳入旗下…...
Qt--动态链接库的创建和使用
写在前面 在Qt的实际开发中,免不了使用和创建动态链接库,因此熟悉Qt中动态链接库的创建和使用对后续的库开发或使用是非常用必要的。 在之前的文章https://blog.csdn.net/SNAKEpc12138/article/details/126189926?spm1001.2014.3001.5501中已经对导入…...
设计模式十二:享元模式(Flyweight Pattern)
当我们需要创建大量相似对象时,享元模式可以帮助我们节省内存空间和提高性能。该模式通过共享相同的数据来减少对象的数量。 在享元模式中,有两种类型的对象:享元(Flyweight)和非享元(Unshared Flyweight&a…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...
