一、GreenDao简介
首先,greendao是一种ORM实现技术。ORM(Object Relation Mapping 即 对象关系映射),通俗讲就是将面向对象编程语言里的对象与数据库关联起来的一种技术。所以,greenDao其实就是一种将java object 与SQLite Database关联起来的桥梁。
二、GreenDao特点
1、greenDao可以说是当今最流行,最高效而且还在迭代的关系型数据库
2、存取速度快,每秒中可以操作数千个实体
以下是几种ORM的性能对比:
3、支持数据库加密,支持android原生的数据库SQLite,也支持SQLCipher(在SQLite基础上加密型数据库)
4、轻量级,greenDao的代码库仅仅100k大小
5、支持缓存,能够将使用的过的实体存在缓存中,下次使用时可以直接从缓存中取,这样可以使性能提高N个数量级
6、代码自动生成,greenDao 会根据modle类自动生成实体类(entities)和Dao对象,并且Dao对象是根据entities类量身定做的并且一 一对应
三、GreenDao使用
1、配置
在Project : build.gradle文件中
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//设置仓库与插件
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
}
在app : build.gradle文件中
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
...
}
greendao {
//数据库的schema版本,也可以理解为数据库版本号
schemaVersion 1
//设置DaoMaster、DaoSession、Dao包名,也就是要放置这些类的包的全路径。
daoPackage 'com.greendaoproject.dao'
//设置DaoMaster、DaoSession、Dao目录
targetGenDir 'src/main/java'
}
dependencies {
...
//greendao
compile 'org.greenrobot:greendao:3.2.2'
compile 'org.greenrobot:greendao-generator:3.2.2'
}
2、编写Entity类
@Entity
public class Book {
@Id(autoincrement = true)
private Long id;
private String name;
@Property(nameInDb = "price")
private String price;
private String author;
private String publishTime;
}
(几个重要的注解了解一下:
-
@Entity:该对象为实体,可以被dao类操作,会在数据库中生成一个与之相对应的表
-
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
-
@Property:可以自定义字段名,注意外键不能使用该属性
-
@NotNull:属性不能为空
-
@Transient:使用该注释的属性不会被存入数据库的字段中
-
@Unique:该属性值必须在数据库中是唯一值
-
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
-
@Index:创建一个索引,默认是使用字段名
-
@ToOne:表示一对一关系
-
@OrderBy:更加某一字段排序 ,例如:@OrderBy("date ASC")
-
@ToMany:定义一对多个实体对象的关系 )
点击Make Project编译一下,会在配置的包目录下自动生成DaoMaster,DaoSession 和BookDao类
(关于这几个类的说明:
DaoMaster:
使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),我们可以通过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 创建不同模式的 SQLite 数据库。
DaoSession :
管理指定模式下的所有 DAO 对象,DaoSession提供了一些通用的持久性方法比如插入、负载、更新、更新和删除实体。
XxxDAO :
每个实体类 greenDAO 多会生成一个与之对应DAO对象,如:User 实体,则会生成一个一个UserDao 类。)
同时,Book类会自动加入一些代码,变成:
@Entity
public class Book {
@Id(autoincrement = true)
private Long id;
private String name;
@Property(nameInDb = "price")
private String price;
private String author;
private String publishTime;
@Generated(hash = 1044477273)
public Book(Long id, String name, String price, String author,
String publishTime) {
this.id = id;
this.name = name;
this.price = price;
this.author = author;
this.publishTime = publishTime;
}
@Generated(hash = 1839243756)
public Book() {
}
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 String getPrice() {
return this.price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAuthor() {
return this.author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishTime() {
return this.publishTime;
}
public void setPublishTime(String publishTime) {
this.publishTime = publishTime;
}
}
3、为了使用方便,避免重复初始化,我们新建一个DBManager
public class DBManager {
// 是否加密
public static final boolean ENCRYPTED = true;
private static final String DB_NAME = "test.db";
private static DaoMaster.DevOpenHelper mDevOpenHelper;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;
private static DBManager mDbManager;
private Context mContext;
private DBManager(Context context) {
this.mContext = context;
// 初始化数据库信息
mDevOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
getDaoMaster(context);
getDaoSession(context);
}
public static DBManager getInstance(Context context) {
if (null == mDbManager) {
synchronized (DBManager.class) {
if (null == mDbManager) {
mDbManager = new DBManager(context);
}
}
}
return mDbManager;
}
/**
* 获取可读数据库
*
* @param context
* @return
*/
public static SQLiteDatabase getReadableDatabase(Context context) {
if (null == mDevOpenHelper) {
getInstance(context);
}
return mDevOpenHelper.getReadableDatabase();
}
/**
* 获取可写数据库
*
* @param context
* @return
*/
public static SQLiteDatabase getWritableDatabase(Context context) {
if (null == mDevOpenHelper) {
getInstance(context);
}
return mDevOpenHelper.getWritableDatabase();
}
/**
* 获取DaoMaster
*
* @param context
* @return
*/
public static DaoMaster getDaoMaster(Context context) {
if (null == mDaoMaster) {
synchronized (DBManager.class) {
if (null == mDaoMaster) {
mDaoMaster = new DaoMaster(getWritableDatabase(context));
}
}
}
return mDaoMaster;
}
/**
* 获取DaoSession
*
* @param context
* @return
*/
public static DaoSession getDaoSession(Context context) {
if (null == mDaoSession) {
synchronized (DBManager.class) {
mDaoSession = getDaoMaster(context).newSession();
}
}
return mDaoSession;
}
}
4、基本操作(增、删、改、查)
新建一个BookDaoOperation,调用静态方法,传入对应的参数即可实现book表的增、删、改、查
public class BookDaoOperation {
/**
* 添加数据至数据库
*
* @param context
* @param book
*/
public static void insertData(Context context, Book book) {
DBManager.getDaoSession(context).getBookDao().insert(book);
}
/**
* 将数据实体通过事务添加至数据库
*
* @param context
* @param list
*/
public static void insertData(Context context, List<Book> list) {
if (null == list || list.size() <= 0) {
return;
}
DBManager.getDaoSession(context).getBookDao().insertInTx(list);
}
/**
* 添加数据至数据库,如果存在,将原来的数据覆盖
* 内部代码判断了如果存在就update(entity);不存在就insert(entity);
*
* @param context
* @param book
*/
public static void saveData(Context context, Book book) {
DBManager.getDaoSession(context).getBookDao().save(book);
}
/**
* 删除数据至数据库
*
* @param context
* @param book 删除具体内容
*/
public static void deleteData(Context context, Book book) {
DBManager.getDaoSession(context).getBookDao().delete(book);
}
/**
* 根据id删除数据至数据库
*
* @param context
* @param id 删除具体内容
*/
public static void deleteByKeyData(Context context, long id) {
DBManager.getDaoSession(context).getBookDao().deleteByKey(id);
}
/**
* 删除全部数据
*
* @param context
*/
public static void deleteAllData(Context context) {
DBManager.getDaoSession(context).getBookDao().deleteAll();
}
/**
* 更新数据库
*
* @param context
* @param book
*/
public static void updateData(Context context, Book book) {
DBManager.getDaoSession(context).getBookDao().update(book);
}
/**
* 查询所有数据
*
* @param context
* @return
*/
public static List<Book> queryAll(Context context) {
QueryBuilder<Book> builder = DBManager.getDaoSession(context).getBookDao().queryBuilder();
return builder.build().list();
}
/**
* 带查询条件查询
*
* @param context
* @return
*/
public static List<Book> queryWithCondition(Context context, WhereCondition condition) {
QueryBuilder<Book> builder = DBManager.getDaoSession(context).getBookDao().queryBuilder().where(condition);
return builder.build().list();
}
/**
* 分页加载
* @param context
* @param pageSize 当前第几页(程序中动态修改pageSize的值即可)
* @param pageNum 每页显示多少个
* @return
*/
public static List<Book> queryPaging( int pageSize, int pageNum,Context context){
BookDao bookDao = DBManager.getDaoSession(context).getBookDao();
List<Book> listMsg = studentDao.queryBuilder()
.offset(pageSize * pageNum).limit(pageNum).list();
return listMsg;
}
}
Dao对象其他API的介绍
-
增加单个数据
-
-
insert(shop);
-
insertOrReplace(book);
-
-
增加多个数据
-
-
insertInTx(bookList);
-
insertOrReplaceInTx(bookList);
-
-
查询全部
-
-
List< Book> list = getBookDao().loadAll();
-
List< Book> list = getBookDao().queryBuilder().list();
-
-
查询附加单个条件
-
-
.where()
-
.whereOr()
-
-
查询附加多个条件
-
-
.where(, , ,)
-
.whereOr(, , ,)
-
-
查询附加排序
-
-
.orderDesc()
-
.orderAsc()
-
-
查询限制当页个数
-
-
.limit()
-
-
查询总个数
-
-
.count()
-
-
修改单个数据
-
-
getBookDao().update(book);
-
-
修改多个数据
-
-
getBookDao().updateInTx(bookList);
-
-
删除单个数据
-
-
getBookDao().delete(user);
-
-
删除多个数据
-
-
getBookDao().deleteInTx(userList);
-
-
删除数据ByKey
-
-
getBookDao().deleteByKey();
-