转载务必保留如下信息:
本文做者:speedy
CSDN 专栏:blog.csdn.net/speedystone
掘金专栏:juejin.im/user/57e082…java
greenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,咱们操做数据库的时候,不在须要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小 同时仍是支持数据库加密。android
greenDAO 官网地址:greenrobot.org/greendao/git
一、对象映射( ORM)github
greenDAO 是ORM 框架,能够很是便捷的将Java 对象映射到 SQLite 数据库中保存。sql
二、高性能数据库
ORM 框架有不少,比较著名的有 OrmLite , ActiveAndroid 等,性能也不同,下图是 GreenDao 官方给出的性能对比。安全
三、支持加密服务器
GreenDao 是支持加密的,能够安全的保存用户数据。app
四、轻量级框架
GreenDao 核心库小于100k ,因此咱们并不会担忧添加 GreenDao 后 APK 大小会变的是否庞大。
五、支持 protocol buffer(protobuf) 协议
GreenDao 支持 protocol buffer(protobuf) 协议数据的直接存储,若是你经过 protobuf 协议与服务器交互,将不须要任何的映射。
6,代码生成
greenDAO 会根据配置信息自动生成核心管理类以及 DAO 对象
7,开源
greenDAO 是开源的,咱们能够在github 上下载源码,学习。github 地址:github.com/greenrobot/…
DaoMaster:
使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),咱们能够经过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 建立不一样模式的 SQLite 数据库。
DaoSession :
管理指定模式下的全部 DAO 对象,DaoSession提供了一些通用的持久性方法好比插入、负载、更新、更新和删除实体。
XxxDAO :
每一个实体类 greenDAO 多会生成一个与之对应DAO对象,如:User 实体,则会生成一个一个UserDao 类
Entities
可持久化对象。一般, 实体对象表明一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。
核心类之间的关系
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}复制代码
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
// This is only needed if you want to use encrypted databases
compile 'net.zetetic:android-database-sqlcipher:3.5.6'//加密库依赖(可选项)
}复制代码
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.speedystone.greendaodemo.db'// 设置DaoMaster、DaoSession、Dao 包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}复制代码
1, 咱们写一个简单的实体类(User),测试一下
package com.speedystone.greendaodemo.model;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
/**
* Created by Speedy on 2017/6/30.
*/
@Entity
public class User {
@Id
private long id;
private String name;
private int age;
//此处省略了getter,setter 方法
}复制代码
二、点击 Make Project(或者 Make Moudle 'App') 编译一下工程 。若是配置正确,会在配置的包目录下自动会生成 DaoMaster,DaoSession 和 UserDao 类 。
3,初始化 GreenDao ( 一般初始化代码写在咱们的 Application 类中)
4,获取 UserDao
MyApp myApp = (MyApp) getApplication();
DaoSession daoSession = myApp.getDaoSession();
UserDao userDao = daoSession.getUserDao();复制代码
5, 保存记录
User user = new User();
user.setUserId(1);
user.setName("小明");
user.setAge(16);
userDao.insert(user);复制代码
User user = new User();
user.setUserId(1);
user.setName("小明");
user.setAge(16);
//插入或者替换
userDao.insertOrReplace(user);复制代码
5, 删除记录
public void delete(User user){
userDao.delete(user);
}复制代码
或者
public void deleteByUserId(long userid){
userDao.deleteByKey(1L);
}复制代码
6,更新记录
public void update(User user){
userDao.update(user);
}复制代码
7,查询记录
public Listquery(){ return userDao.loadAll();// 查询全部记录 } 复制代码
public User query2(){
return userDao.loadByRowId(1);//根据ID查询
}复制代码
public Listquery2(){ return userDao.queryRaw("where AGE>?","10");//查询年龄大于10的用户 } 复制代码
//查询年龄大于10的用户 public Listquery4(){ QueryBuilder 复制代码builder = userDao.queryBuilder(); return builder.where(UserDao.Properties.Age.gt(10)).build().list(); }
@Entity
代表这个实体类会在数据库中生成一个与之相对应的表
属性:
@Entity(
schema = "myschema",
active = true,
nameInDb = "AWESOME_USERS",
indexes = {
@Index(value = "name DESC", unique = true)
},
createInDb = true,
generateConstructors = false,
generateGettersSetters = true
)
public class User {
...
}复制代码
@Id
对应数据表中的 Id 字段
@Index
使用@Index做为一个属性来建立一个索引,默认是使用字段名
@Entity
public class User {
@Id
private Long id;
@Index(unique = true)
private String name;
}复制代码
@Property
设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "userName")
@NotNull
设置数据库表当前列不能为空
@Transient
添加此标记后不会生成数据库表的列
@Unique
表名该属性在数据库中只能有惟一值
@Entity
public class User {
@Id
private Long id;
@Unique
private String name;
}复制代码
@ToOne
表示一对一关系
@Entity
public class Order {
@Id private Long id;
private long customerId;
@ToOne(joinProperty = "customerId")
private Customer customer;
}
@Entity
public class Customer {
@Id
private Long id;
}复制代码
@OrderBy
更加某一字段排序 ,例如:@OrderBy("date ASC")
@ToMany
定义一对多个实体对象的关系
@Entity public class Customer { @Id private Long id; @ToMany(referencedJoinProperty = "customerId") @OrderBy("date ASC") private Listorders; } @Entity public class Order { @Id private Long id; private Date date; private long customerId; } 复制代码