热门标签 | 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 初探或者查阅官网地址


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
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社区 版权所有