您的位置:首页 > 移动开发 > Android开发

GreenDao框架入门及基础使用(Android studio 完整配置)

2017-06-12 14:06 656 查看

GreenDao框架入门及基础使用(Android studio 完整配置)

一、初识GreenDao框架

GreenDao是一款ORM(object/relational mapping 对象关系映射)框架。是目前普片认为从实用性,高效性,方便性等各方面公认最好的一款轻量级ORM框架。
之前类似的框架(具有ORM模块功能)的又ormlite,xUtil等等类似框架。


GreenDao的官网:http://greenrobot.org/greendao/

GreenDao的下载地址:https://github.com/greenrobot/greenDAO

二、GreenDao在程序代码中做哪一个层面的东西。

首先,GreenDao是一个ORM框架,那么什么是ORM?
ORM是对象关系映射,那什么是对象(Object),什么是关系(Relational)?对象就是Java对象(不多解释,如果什么是java对象都不知道,就先去学习Java基础),关系就是数据库中的二维表,在数据库中的二维表也叫做关系。对象关系映射,就是java对象和数据库中的表进行一一对应,使用一个java对象去表示一个数据库的表。所以GreenDao就是一个将SQLite数据库和Java Object对象进行关联的框架。
那么就是说,GreenDao主要用在数据持久层,就是操作数据库(库,表,数据)的一系列(CRUD)增删改查的封装,它就是一款让我们能在代码中快速建表,查数据,更新删除数据,更新表等的工具。


三、GreenDao在项目中的完整使用配置。

本文章中完全基于gradle配置搭建,网上有些关于这方面的文章,写了要创建一个module,还要创建一个java module或是java 类来创建生成 greendao相关辅助类等,这样个人感觉有点太麻烦。


1.创建Demo Module。

我们将greendao相关代码放置在src\main目录下,即java源码同级目录,新建java-gen,如



此时java-gen只是一个目录,并非源码目录,区别于java蓝色文件夹图标,所以在gradle文件中的android 节点下加上如下代码,同步gradle文件即可

sourceSets {
main{
java.srcDirs = ['src/main/java', 'src/main/java-gen']
}
}




2.应用依赖库和插件。

打开module的设置页面,搜索greendao如图添加依赖,对应红色方框的两个jar:



同时在gradle文件顶部,第一行下面加入以下开码:

apply plugin: 'org.greenrobot.greendao'

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
}

greendao {
schemaVersion 1
daoPackage 'com.frosty.dao'
targetGenDir 'src/main/java-gen'
}


说明:schemaVersion -->数据库版本,今后数据库升级用到;daoPackage --> green到自动生成的dao模型位置的包名。

至此,greendao完整配置已经完成!但此时你同步后发现java-gen目录下还是什么都没有
原因是greendao会根据你整映程目录下的注有@Entity的类去实现orm映射,才去生成相关的辅助类。


四、编写你的实体类

我们在java-gen目录新建存放实体的包名,并创建一个Teacher实体



实体代码如下:

@Entity
public class Teacher {

@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "USERNAME")
private String name;
@NotNull
private int age;
@Transient
private int flag;

@Generated
public Teacher() {
}

@Generated
public Teacher(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}


五、Build Make,生成对应Dao

写好此实体类后,在gradle文件中确定好生成的dao目录,然后Sync



然后Build中Make一下即可生成对应的dao



我们点开DaoMaster或者DaoSession,你会发现这个注解



所以问题来了,那么不让我们修改这些个类,如何使用使用或者扩展他们?

六、 封装你的数据库工具类

在如
4000
图目录新建db目录,用于存放你的工具类,注意这里我们以后在实际应用中,需要新增实体时候,规则和Teacher一样,Make后会自动在dao目录下生成对应的xxDao,同时会自动更新Dao下的DaoMaster类。

我们创建DaoManager类,用于数据库相关实例的获取或维护,借助这个类创建或者管理数据库,关闭连接等操作,完整代码如下:

/**
* Created by Frosty on 2017/6/7.
*/

public class DaoManager {
//TAG
public static final String TAG = DaoManager.class.getSimpleName();
//上下文
private static Context mContext;
//数据库名称
private static final String DB_NAME = "wincloud.db";
//多线程访问
private volatile static DaoManager manager;
//操作类
private static DaoMaster.DevOpenHelper helper;
//核心类
private static DaoMaster daoMaster;
private DaoSession daoSession;
private SQLiteDatabase db;

/*单例模式*/
private DaoManager(){}
private static class DaoManagerFactory{
static DaoManager daoManager = new DaoManager();
}
public static DaoManager getInstance(Context context){
if(mContext==null) mContext= context;
return DaoManagerFactory.daoManager;
}

/**
* 判断是否存在数据库,如果没有则创建
*
* @return
*/
public DaoMaster getDaoMaster(){
if(null == daoMaster){
helper = new DaoMaster.DevOpenHelper(mContext,DB_NAME,null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
}
return daoMaster;
}

/**
* 完成对数据库的操作,只是个接口
* 中间件提供
* @return
*/
public DaoSession getDaoSession(){
if(null == daoSession){
if(null == daoMaster){
daoMaster = getDaoMaster();
}
daoSession = daoMaster.newSession();
}
return daoSession;
}

/**
* 获取数据库
* @return
*/
public SQLiteDatabase getDatabase(){
return db;
}

/**
* 打开输出日志,默认关闭
*/
public void setDebug(){
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
}

/**
* 关闭DaoSession
*/
public void closeDaoSession(){
if(null!=daoSession){
daoSession.clear();
daoSession = null;
}
}

/**
* 关闭Helper
*/
public void closeHelper(){
if(helper != null){
helper.close();
helper = null;
}
}

/**
* 关闭所有的操作
*/
public void closeConnection(){
closeHelper();
closeDaoSession();
}

}


同时我们创建DBUtils类,用于模型数据到数据库的操作对接,例如增、删、改、查等具体操作,以下代码仅提供样例,根据Teacher模型数据来操作。完整代码如下:

/** Created by Frosty on 2017/6/7.
*/
public class DBUtils {
private DaoManager daoManager;
private static Context mContext;
/*单利*/
private DBUtils(){
daoManager = DaoManager.getInstance(mContext);
}
private static class DBUtilsFactory{
static DBUtils dbUtils = new DBUtils();
}
public static DBUtils getInstance(Context context){
if(mContext==null) mContext = context;
return  DBUtilsFactory.dbUtils;
}
/**
* 对数据库中Teacher表的插入操作
* @param Teacher
* @return
*/
public boolean insertTeacher(Teacher Teacher) {
boolean flag = false;
flag = daoManager.getDaoSession().insert(Teacher) != -1 ? true : false;
return flag;
}

/**
* 批量插入
*
* @param Teachers
* @return
*/
public boolean inserMultTeacher(final List<Teacher> Teachers) {
//标识
boolean flag = false;
try {
//插入操作耗时
daoManager.getDaoSession().runInTx(new Runnable() {
@Override
public void run() {
for (Teacher Teacher : Teachers) {
daoManager.getDaoSession().insertOrReplace(Teacher);
}
}
});
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}

/**
* 修改
* @param Teacher
* @return
*/
public boolean updateTeacher(Teacher Teacher){
boolean flag = false;
try{
daoManager.getDaoSession().update(Teacher);
flag = true;
}catch (Exception e){
e.printStackTrace();
}
return  flag;
}

/**
* 删除
*
* @param Teacher
* @return
*/
public boolean deleteTeacher(Teacher Teacher) {
boolean flag = false;
try {
//删除指定ID
daoManager.getDaoSession().delete(Teacher);
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}

/**
* 查询单条
*
* @param key
* @return
*/
public Teacher listOneTeacher(long key) {
return daoManager.getDaoSession().load(Teacher.class, key);
}

/**
* 全部查询
*
* @return
*/
public List<Teacher> listAll() {
return daoManager.getDaoSession().loadAll(Teacher.class);
}

/**
* 原生查询
*/
public void queryNative() {
//查询条件
String where = "where name like ? and _id > ?";
//使用sql进行查询
List<Teacher> list = daoManager.getDaoSession().queryRaw(Teacher.class, where,
new String[]{"%l%", "6"});
}elass);
//查询年龄大于19的李四
List<Teacher> list = queryBuilder.where(Teacher
Dao.Properties.Age.ge(19)).where(TeacherDao.Properties.Name.like("李四")).list();
}
}


七、 使用工具类

很简单,获取DBUtil单例,直接调用对应方法即可,如图:



结束语:本文章copy代码的时候高亮代码看着可能有点紊乱,代码可以直接copy到你的类中,引入对于包即可,源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息