热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GreenDAO快速入门

前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的

前言

之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的差异。只停留在会使用的阶段。说起来也是惭愧。本文的重点也是在于如何快速使用。不会进行较深的探究。

GreenDAO:

介绍:对象关系映射的数据库(ORM)

《GreenDAO快速入门》 GreenDAO

官网地址

  • 优点
  1. 性能高,号称Android最快的关系型数据库
  2. 内存占用小
  3. 库文件小,编译时间短
  4. 支持数据库加密
  5. API简介易用

说了他的优点,那么我们来看下如何使用。

  • 导入
    首先在Project下的build.gradle中添加如下:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
}
...

在App中的build.gradle添加如下:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
...//省略
}
dependencies {
...//省略
compile 'org.greenrobot:greendao:3.2.0'
}

  • 注解
实体@Entity注解
  1. schema:告知GreenDao当前实体属于哪个schema
  2. active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
  3. nameInDb:在数据中使用的别名,默认使用的是实体的类名
  4. indexes:定义索引,可以跨越多个列
  5. createInDb:标记创建数据库表
基础属性注解
  1. @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
  2. @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb=”name”)
  3. @NotNul:设置数据库表当前列不能为空
  4. @Transient :添加次标记之后不会生成数据库表的列
索引注解
  1. @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
  2. @Unique:向数据库列添加了一个唯一的约束
关系注解

@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系
这里只是取出一些具有代表性的注解,想了解更多请查看上面官方文档地址

在了解了基本的注解后我们来看下如何具体使用:

  1. 首先创建的我们的实体类

@Entity
public class User {
@Id
private Long id;
private String name;
private int age;
private String sex;
}

创建完成后需要Rebuild Project,之后User会变成:

@Entity
public class User {
@Id
private Long id;
private String name;
private int age;
private String sex;
public User(String name, int age, String sex) {//自己添加的构造方法,并非GreenDAO生成的
this.name = name;
this.age = age;
this.sex = sex;
}
@Generated(hash = 689493095)
public User(Long id, String name, int age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
@Generated(hash = 586692638)
public User() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}

同时会生成3个类:

《GreenDAO快速入门》 图片.png

UserDao:我们的增删改查都是通过他来完成的。

DaoSession:用来注册UserDao,提供创建UserDao的方法

DaoMaster:主要是用来创建DaoSession和一些更新,创建,删除表的一些炒作

里面的源码不多,有兴趣的可以看下。

剩下的我们就来具体看下我们和进行输出操作:

public class DBManager {
public static DBManager instance;
private DaoMaster.DevOpenHelper mOpenHelper = null;
private static final String DB_NAME = "test_db";
private Context context;
private DBManager(Context context) {
this.cOntext= context;
}
public static DBManager getInstance(Context context) {
if (instance == null) {
synchronized (DBManager.class) {
if (instance == null) {
instance = new DBManager(context);
}
}
}
return instance;
}
public SQLiteDatabase getReadableDatabase() {
if (mOpenHelper == null) {
mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
}
return mOpenHelper.getReadableDatabase();
}
public SQLiteDatabase getWritableDatabase() {
if (mOpenHelper == null) {
mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
}
return mOpenHelper.getWritableDatabase();
}
//保存一个User
public void saveUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.save(user);//与userDao.insert()大致相同区别在于如果不存在就插入,存在就Update修改
}
//保存User集合
public void saveUserOrList(List users) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.saveInTx(users);
}
//保存多个User
public void saveUserOrUsers(User... users) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.saveInTx(users);
}
public void deleteUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.delete(user);
}
public void deleteUserById(Long id) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.deleteByKey(id);
}
public void updateUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.update(user);
}
public List queryBySex(String sex) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
QueryBuilder queryBuilder = userDao.queryBuilder();
List users = queryBuilder.where(UserDao.Properties.Sex.eq(sex)).list();
return users;
}
public List query() {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
List users = userDao.queryBuilder().build().list();
return users;
}
public List queryByAge(int age) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
QueryBuilder queryBuilder = userDao.queryBuilder();
List users = queryBuilder.offset(1)
.limit(3)
.orderAsc(UserDao.Properties.Age)
.where(UserDao.Properties.Age.eq(age))
.build()
.list();
return users;
}
public void updateDatabase(int version) {
mOpenHelper.onUpgrade(getWritableDatabase(), 1, version);
}
}

需要注意的是在升级数据库的时候回将原来的数据删除,可能会造成丢失推荐学习文章

GreenDAO的大部分操作都有这里。对于更高级的用法还需要大家自己去学习和探索,毕竟本文的核心和题目一样,快速入门。
为了方便学习推荐一篇文章greenDAO 3.2 初探或者查阅官网地址


推荐阅读
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有