greenDao官网地址:http://greenrobot.org/greendao/
一、前言
1、greenDao:对您的数据库使用greenDao ORM(Object Relational Mapping)
greenDao是一个开源的Android ORM,使得Sqlite数据库变得更加方便。它减轻了开发者处理低级数据需求,从而缩短了开发时间。Sqlite是一个嵌入型的关系数据库。但是,编写SQL和解析查询结果是相当冗长和耗时的任务,greenDao通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”)来释放这些。这样,您可以使用简单的面向对象的API存储,更新,删除和查询Java对象。
Object Relation Mapping对象关系映射
2、GreenDao之所以很流行,跟它的优点是息息相关的,从官网中可以看到这样一张图,其表示了在主流的ORM第三方库中,其对数据库操作的速度是最快的
3、greenDao的功能预览
最高性能(可能是Android的最快ORM);
易于使用的强大的API,涵盖关系和联接;
最小的内存消耗;
小的库大小(<100KB),以保持您的构建时间低,并避免65k方法限制;
数据库加密:greenDAO支持SQLCipher以保证用户的数据安全;
强大的社区:超过5.000 GitHub Start表明有一个强大和活跃的社区;
二、GreenDao3.2的配置
下面我就根据网上的一些教程进行配置,3.0之前的配置貌似比较烦,还好升级了
亲测有效!
1、在工程(Project)的build.gradle中添加依赖
dependencies {
//greenDao生产代码插件
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
}
2、在项目(Module)的build.gradle中添加依赖
//greendao插件
apply plugin: 'org.greenrobot.greendao'
android {
greendao {
//数据库schema版本,也可以理解为数据库版本号
schemaVersion 1
//设置DaoMaster 、DaoSession、Dao包名
daoPackage 'com.millet.demotest.db'
//设置DaoMaster 、DaoSession、Dao目录
targetGenDir 'src/main/java'
//设置生成单元测试目录
//targetGenDirTest
//设置自动生成单元测试用例
//generateTests
}
}
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
}
在gradle的根模块中加入上述代码,就完成了我们的基本配置了。
schemaVersion—->指定数据库schema版本号,迁移等操作会用到
daoPackage——–>通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名
targetGenDir——–>这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的Java目录中,而不是build中,这样就不用额外的设置资源目录了
三、创建实体类(表名和字段名)
GreenDao需要创建Bean对象之后,该Bean对象就是表名,而它的属性值就是字段名,其实现是通过注释的方式来实现的,下面是一个的Bean对象(每个Bean对象对应一张表)
@Entity
public class Shop{
//表示为购物车列表
public static final int TYPE_CART = 0x01;
//表示为收藏列表
public static final int TYPE_LOVE = 0x02;
//不能用int
@Id(autoincrement = true)
private Long id;
//商品名称
@Unique
private String name;
//商品价格
@Property(nameInDb = "price")
private String price;
//已售数量
private int sell_num;
//图标url
private String image_url;
//商家地址
private String address;
//商品列表类型
private int type;
}
这里需要注意的是,创建完成之后,需要build gradle来完成我们的代码自动生成。自动生成的代码有:
Bean实体的构造方法和get、set方法
DaoMaster、DaoSession、DAOS类
生成上面的方法和类需要编译或者运行一下:
这里对Bean对象的注释进行解释:
@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
四、创建数据库(数据库名)
1、一般都是在Application的子类中创建,例如:
public class BaseApplication extends Application {
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
//配置数据库
setupDatabase();
}
/**
* 配置数据库
*/
private void setupDatabase() {
//创建数据库millet.db"
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "millet.db", null);
//获取可写数据库
SQLiteDatabase db = helper.getWritableDatabase();
//获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
//获取Dao对象管理者
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoInstant() {
return daoSession;
}
}
可以发现,GreenDao已经将我们的数据库创建缩成几句话,代码会自动将Bean对象创建成表,不再是传统的手写SQL语句。这里的数据库创建只需要在Application中执行一次即可,这里对几个类进行解释
- DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
- DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
- DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
由于我们已经创建好了DaoSession和Shop的Bean对象,编译后会自动生成我们的ShopDao对象,可通过DaoSession获得
ShopDao dao = daoSession.getShopDao();
五、在代码中使用
增删改查:
public class MilletDao {
/**
* 添加数据,如果有重复则覆盖
*
* @param shop
*/
public static void insertLove(Shop shop) {
BaseApplication.getDaoInstant().getShopDao().insertOrReplace(shop);
}
/**
* 删除数据
*
* @param id
*/
public static void deleteLove(long id) {
BaseApplication.getDaoInstant().getShopDao().deleteByKey(id);
}
/**
* 更新数据
*
* @param shop
*/
public static void updateLove(Shop shop) {
BaseApplication.getDaoInstant().getShopDao().update(shop);
}
/**
* 查询条件为Type=TYPE_LOVE的数据
*
* @return
*/
public static List<Shop> queryLove() {
return BaseApplication.getDaoInstant().getShopDao().queryBuilder().where(ShopDao.Properties.Type.eq(Shop.TYPE_LOVE)).list();
}
/**
* 查询全部数据
*/
public static List<Shop> queryAll() {
return BaseApplication.getDaoInstant().getShopDao().loadAll();
}
}
效果很明显,GreenDao的封装更加短小精悍,语义明朗,下面对GreenDao中Dao对象其他API的介绍
增加单个数据
getShopDao().insert(shop);
getShopDao().insertOrReplace(shop);
增加多个数据
getShopDao().insertInTx(shopList);
getShopDao().insertOrReplaceInTx(shopList);
查询全部
List< Shop> list = getShopDao().loadAll();
List< Shop> list = getShopDao().queryBuilder().list();
查询附加单个条件
.where()
.whereOr()
查询附加多个条件
.where(, , ,)
.whereOr(, , ,)
查询附加排序
.orderDesc()
.orderAsc()
查询限制当页个数
.limit()
查询总个数
.count()
修改单个数据
getShopDao().update(shop);
修改多个数据
getShopDao().updateInTx(shopList);
删除单个数据
getTABUserDao().delete(user);
删除多个数据
getUserDao().deleteInTx(userList);
删除数据ByKey
getTABUserDao().deleteByKey();