android 获取相机拍照保存到sqlite_一篇好文之Android数据库GreenDao的完全解析

前言

之前在开发过程中,数据库基本上会使用 Litepal 和 SQlite 自己写,最近换新环境,公司原先使用的数据库就是 GreenDao,在各种情况的作用下,准备了解下 GreenDao,顺便写一篇文章记录下 GreenDao 的基本使用!大家在使用 GreenDao 的时候遇到什么问题,欢迎帮忙给我留言。

回归正题,不再扯没用的了!本文主要从如下几个方面进行讲解:

1. 存储的数据库结构

2. GreenDao的优缺点

3. GreenDao 的使用配置

4. 使用GreenDao实现数据的增删改查

5. GreenDao的注解使用

6. GreenDao的关系处理

7. GreenDao数据库加密

咱们先看一波最终的效果图:

c8f9646151474782924d9e704168fecb

存储的数据库结构

学习数据库之前,我们先得设计自己的数据库,不多废话,下面是我此次学习的数据库结构,后面所有的数据请参考这个图进行学习:

f9a3b32d022c4d238fd918d62565240b

GreenDao的介绍

什么是GreenDao?

GreenDAO 是一个开源的 Android ORM(“对象/关系映射”),通过 ORM(称为“对象/关系映射”),在我们数据库开发过程中节省了开发时间!

207c947fda0a45809f8ca96d98051b4d

GreenDao的官方文档

GreenDao,适用于您的SQLite数据库的 Android ORM:

http://greenrobot.org/greendao/

GreenDao的作用?

通过 GreenDao,我们可以更快速的操作数据库,我们可以使用简单的面相对象的API来存储,更新,删除和查询 Java 对象。

GreenDao的优缺点?

  1. 高性能,下面是官方给出的关于 GreenDao,OrmLite 和 ActiveAndroid 三种 ORM 解决方案的数据统计图:
e23f4175149742059c8b30ba4533e9c5
  1. 易于使用的强大 API,涵盖关系和连接;
  2. 最小的内存消耗;
  3. 小库大小(<100KB)以保持较低的构建时间并避免65k 方法限制;
  4. 数据库加密:greenDAO 支持 SQLCipher,以确保用户的数据安全;

GreenDao的使用

GreenDao 的核心类有三个:分别是 DaoMaster,DaoSession,XXXDao,这三个类都会自动创建,无需自己编写创建!

  • DaoMaster::DaoMaster 保存数据库对象(SQLiteDatabase)并管理特定模式的 DAO 类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类 OpenHelper 和DevOpenHelper 是 SQLiteOpenHelper 实现,它们在 SQLite 数据库中创建模式。
  • DaoSession:管理特定模式的所有可用 DAO 对象,您可以使用其中一个getter方法获取该对象。DaoSession 还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。
  • XXXDao:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO 生成DAO。它具有比 DaoSession 更多的持久性方法,例如:count,loadAll 和 insertInTx。
  • Entities :可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。
801d1250c99b4831b496f81853433e5a

导入 Gradle 插件和 Dao 代码生成

要在 Android 项目中使用 GreenDao,您需要添加 GreenDao Gradle 插件并添加GreenDao 库:

导入插件

// 在 Project的build.gradle 文件中添加:buildscript { repositories { jcenter() mavenCentral() // add repository } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin }}

配置相关依赖

// 在 Moudle:app的 build.gradle 文件中添加:apply plugin: 'com.android.application'apply plugin: 'org.greenrobot.greendao' // apply plugindependencies { implementation 'org.greenrobot:greendao:3.2.2' // add library}

配置数据库相关信息

greendao { schemaVersion 1 //数据库版本号 daoPackage 'com.aserbao.aserbaosandroid.functions.database.greenDao.db'// 设置DaoMaster、DaoSession、Dao 包名 targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 generateTests false //设置为true以自动生成单元测试。 targetGenDirTests 'src/main/java' //应存储生成的单元测试的基本目录。默认为 src / androidTest / java。}

GreenDao初始化

我们可以在Application中维持一个全局的会话。我们在 Applicaiton 进行数据库的初始化操作:

 /** * 初始化GreenDao,直接在Application中进行初始化操作 */ private void initGreenDao() { DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "aserbao.db"); SQLiteDatabase db = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); } private DaoSession daoSession; public DaoSession getDaoSession() { return daoSession; }

创建存储对象实体类

使用 GreenDao 存储数据只需要在存储数据类前面声明 @Entity 注解就让 GreenDao 为其生成必要的代码:

@Entitypublic class Student { @Id(autoincrement = true) Long id; @Unique int studentNo;//学号 int age; //年龄 String telPhone;//手机号 String sex; //性别 String name;//姓名 String address;//家庭住址 String schoolName;//学校名字 String grade;//几年级 ……getter and setter and constructor method…… }

这时候重新 build 一下项目会发现在设置的 targetGenDir 的目录生成三个类文件,这个是GreenDao 自动生成的!

使用 GreenDao 实现增删改查

insert() 插入数据

@Override public void insertData(Thing s) { DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession(); for (int i = 0; i < 1000; i++) { Student student = new Student(); student.setStudentNo(i); int age = mRandom.nextInt(10) + 10; student.setAge(age); student.setTelPhone(RandomValue.getTel()); String chineseName = RandomValue.getChineseName(); student.setName(chineseName); if (i % 2 == 0) { student.setSex("男"); } else { student.setSex("女"); } student.setAddress(RandomValue.getRoad()); student.setGrade(String.valueOf(age % 10) + "年纪"); student.setSchoolName(RandomValue.getSchoolName()); daoSession.insert(student); } }

insertOrReplace()**数据存在则替换,数据不存在则插入

@Override public void insertData(Thing s) { DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession(); for (int i = 0; i < 1000; i++) { Student student = new Student(); student.setStudentNo(i); int age = mRandom.nextInt(10) + 10; student.setAge(age); student.setTelPhone(RandomValue.getTel()); String chineseName = RandomValue.getChineseName(); student.setName(chineseName); if (i % 2 == 0) { student.setSex("男"); } else { student.setSex("女"); } student.setAddress(RandomValue.getRoad()); student.setGrade(String.valueOf(age % 10) + "年纪"); student.setSchoolName(RandomValue.getSchoolName()); daoSession.insertOrReplace(student);//插入或替换 } }

删除有两种方式:delete()和 deleteAll();分别表示删除单个和删除所有。

@Override public void deleteData(Student s) { DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession(); daoSession.delete(s); }
@Override public void deleteAll() { DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession(); daoSession.deleteAll(Student.class); }

通过 update 来进行修改:

@Override public void updataData(Student s) { DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession(); daoSession.update(s); }

查询的方法有:

  • loadAll():查询所有数据。
  • queryRaw():根据条件查询。
  • queryBuilder() : 方便查询的创建,后面详细讲解。
public List queryAll(){ List students = daoSession.loadAll(Student.class); return students; }@Override public void queryData(String s) { List students = daoSession.queryRaw(Student.class, " where id = ?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值