一、Greendao简介
Greendao是一款用于数据库创建与管理的框架,由于原生SQLite语言比较复杂繁琐,使得不少程序员不得不去学习SQLite原生语言,但是学习成本高,效率低下,所以不少公司致力于开发一款简单的数据库管理框架,较为著名的就有Greendao和ORMLite,但是就数据分析来看,Greendao的效率是高于ORMLite及其他框架的,是目前该行业的领先者。也因为Greendao的使用方法简便,且效率高使得其成为目前使用最为广泛的数据库管理框架,这也是广大程序员的福音。
二、Greendao的使用方法
1.添加依赖
在bulid.gradle文件下的dependencies下添加所需依赖
compile 'org.greenrobot:greendao:3.2.2' // add library
compile 'org.greenrobot:greendao-generator:3.2.2'
2.在bulid.gradle下进行配置
apply plugin: 'org.greenrobot.greendao'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
}
3.对greendao的generator生成文件进行配置
greendao {
schemaVersion 1 //版本
daoPackage '生成文件包名' // 一般为app包名+生成文件的文件夹名
targetGenDir 'src/main/java' //生成文件路径
}
4.创建实体类,生成dao文件
@Entity
public class dayStep {
@Id
private long id;
private String date;
private int step;
private Long sportId;
@ToOne(joinProperty = " sportId")
private SportInfo sportInfo;//关系表
}
注意:编写完实体类以后在实体类界面下按下Ctrl+F9(Make project),程序会自动编译生成dao文件,生成的文件一共有三个。
5.使用Greendao
(1)创建一个application类,在application中完成DaoSession的初始化,避免以后重复初始化,便于使用。
public class MyApplication extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
//静态单例
public static MyApplication instances;
@Override
public void onCreate() {
super.onCreate();
instances = this;
setDatabase();
}
public static MyApplication getInstances(){
return instances;
}
/**
* 设置greenDao
*/
private void setDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
// 此处sport-db表示数据库名称 可以任意填写
mHelper = new DaoMaster.DevOpenHelper(this, "sport-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
(2)Greendao操作数据库文件(增,删,改,查)
/**
* 增
*/
public void insert()
{
String date = new Date().toString();
mDayStep = new dayStep(null,date,0);//第一个是id值,因为是自增长所以不用传入
dao.insert(mDayStep);
}
/**
* 查
*/
public void Search()
{
//方法一
List mDayStep = dao.loadAll();
//方法二
//List mDayStep = dao.queryBuilder().list();
//方法三 惰性加载
//List mDayStep = dao.queryBuilder().listLazy();
for (int i = 0; i < mDayStep.size(); i++) {
String date = "";
date = mDayStep.get(i).getDate();
Log.d("cc", "id: "+i+"date: "+date);
}
}
/**
* 删
* @param i 删除数据的id
*/
public void delete(long i)
{
dao.deleteByKey(i);
//当然Greendao还提供了其他的删除方法,只是传值不同而已
}
/**
*改
* @param i
* @param date
*/
public void correct(long i,String date)
{
mDayStep = new dayStep((long) i,date,0);
dao.update(mDayStep);
}
/**
*修改或者替换(有的话就修改,没有则替换)
*/
public void insertOrReplace(long i,String date)
{
mDayStep = new dayStep((long) i,date,0);
dao.insertOrReplace(mDayStep);
}
/**
*查找符合某一字段的所有元素
*/
public void searchEveryWhere(String str)
{
List mList = dao.queryBuilder()
.where(dao.date.eq(str)).build().listLazy();
}
List mList = dao.queryBuilder()
.where(dao.date.eq(str)).build().listLazy();
}
(3)通过where查询指定数据
/**
* 查询指定用户
*/
public static List SearchUserInfo(int id)
{
//惰性加载
List list = mUserInfoDao.queryBuilder().where(UserInfoDao.Properties.Id.eq(id)).list();
return list;
}
一对一与一对多概念几乎类似,我们在这里就只做一对多的讲解(我们实现一个用户有多张运动表,运动表就是用户表的儿子表,而用户表则是运动表的父表)
运动表
@Entity
public class SportInfo {
@Id
private Long sportId;
//日期
private String date = "";
private Long UserId;
@ToOne(joinProperty = "UserId")
private UserInfo userInfo;//关系表
}
用户表
@Entity
public class UserInfo {
@Id
private Long id;
//账号
private String number;
//密码
private String password;
//昵称
private String nick_name;
//一对多关联
@ToMany(referencedJoinProperty = "sportId")
private List sportInfo;
}
多表关联的增删改查(我已封装成了方法方便使用)
public class DataBaseTool {
private static SportInfoDao mSportInfoDao = MyApplication.getInstances().getDaoSession().getSportInfoDao();
private static UserInfoDao mUserInfoDao = MyApplication.getInstances().getDaoSession().getUserInfoDao();
/**
* 增加运动信息
*/
public static long insertSportInfo(UserInfo userInfo,SportInfo sportInfo)
{
sportInfo.setUserId(userInfo.getId());//增加运动表时要指定其父表(用户表id和用户表)
sportInfo.setUserInfo(userInfo);
return mSportInfoDao.insertOrReplace(sportInfo);
}
/**
* 增加用户信息
*/
public static long insertUserInfo(UserInfo info)
{
return mUserInfoDao.insertOrReplace(info);
}
/**
* 查运动信息
*/
public static List SearchSportInfo(UserInfo userInfo)
{
return userInfo.getSportInfo();//查找运动表则需要通过用户表来获取运动表的集合然后再遍历找到所需运动表
}
/**
* 查用户信息
*/
public static List SearchUserInfo()
{
//惰性加载
List list = mUserInfoDao.queryBuilder().listLazy();
return list;
}
/**
* 删除某条用户信息
* @param i 删除数据的id
*/
public static void deleteUserInfo(long i)
{
mUserInfoDao.deleteByKey(i);
//当然Greendao还提供了其他的删除方法,只是传值不同而已
}
/**
*修改某条运动信息
*/
public static void correctSportInfo(SportInfo info)
{
mSportInfoDao.update(info);
}
/**
*修改某条用户信息
*/
public static void correctUserInfo(UserInfo info)
{
mUserInfoDao.update(info);
}
}
四、Greendao注解含义
(1)@Entity 实体标识
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(2)@Id 每条数据对应的位置,必写项
(3)@Property(nameInDb = "") 表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
(4)@NotNull 不为null
(5)@Unique 唯一约束 该属性值必须在数据库中是唯一值
(6)@ToMany 一对多
(7)@OrderBy 排序
(8)@ToOne 一对一 关系表
(9)@Transient 不保存于数据库
(10)@generated 由greendao产生的构造函数或方法
五、Greendao特性