GreenDao3.0使用详解
Posted Anonymous-OS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GreenDao3.0使用详解相关的知识,希望对你有一定的参考价值。
随着移动端的业务量的增大和用户体验的提高,SQLite的需求很明显了,大大小小的项目几乎成了必备,用我们项目经理的话来说:
1、不用管他什么数据,为了体验,先缓存一下!
2、什么?网络不好导致的?看什么,缓存啊!!!
真不知道他是在哪里听到的这个词,唉!
在他看来,缓存是如此简单的一件事情,当然,缓存其实并不难,就是有点麻烦而已!
之前我一直是用Realm,目前Realm被人称为移动端的新一代王者,但是对于知识,哪有嫌多的呢。
一、GreenDao和Realm对比
我在网上找了一张图片,很能说明问题:
在小量数据的查询与删除等操作中,两者的差距基本可以忽略不计,超过同时插入、删除、查询1000条以上的数据分析得出。GreenDao在删除操作中,占明显优势,而Realm在添加与查询方面优于GreenDAO。各有千秋,看自己的选择。
二、GreenDao配置
1、导入相应的包
compile'org.greenrobot:greendao:3.0.1'
compile'org.greenrobot:greendao-generator:3.0.0'
2、配置app的Gradle
apply plugin: 'org.greenrobot.greendao'
buildscript
repositories
mavenCentral()
dependencies
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
greendao
schemaVersion 1
daoPackage 'com.example.anonymous.greendao.gen'
targetGenDir 'src/main/java'
3、配置greenDao
greendao
schemaVersion 1
daoPackage 'com.example.anonymous.greendao'
targetGenDir 'src/main/java'
schemaVersion---->指定数据库schema版本号,迁移等操作会用到
daoPackage-------->通过gradle插件生成的数据库相关文件,这里我设置的文件路径是com.example.anonymous.greendao
targetGenDir-------->这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了
整体配置预览:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
buildscript
repositories
mavenCentral()
dependencies
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
greendao
schemaVersion 1
daoPackage 'com.example.anonymous.greendao'
targetGenDir 'src/main/java'
android
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig
applicationId "com.example.anonymous.realmdemo"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
dependencies
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.0.1'
compile'org.greenrobot:greendao:3.0.1'
compile'org.greenrobot:greendao-generator:3.0.0'
三、编写实体类(对应的是数据库的每张表)
@Entity
public class User
@Id
private Long id;
private String name;
@Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类
@Id:通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的
就这么简单含有两个字段的实体类
然后点击这个按钮
builder完之后会有两个地方发生了变化
这是GreenDao自动为你生成的,路径就是你在gradle中配置的路径
现在只有一个User表,如果再添加一个Age实体类,你在点击Make Project按钮,他还会把AgeDao自动生成出来
四、增、删、改、查
在增、删、改、查之前第一步做的就是需要对数据库进行初始化,不可能就这样直接对实体类操作,这样不太现实的,否则为什么GreenDao会自动生成这么多代码呢?
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
my-db是数据库的名字,自己随便写就行。
通过GreenDao生成的代码,我们可以获取到实体类的实例,也就是数据库表的实例,这样我们才能操作数据库
1、增加
User user1 = new User(null,"zhangsan");
userDao.insert(user1);
2、删除
User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();
if(findUser != null)
userDao.deleteByKey(findUser.getId());
3、修改
User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();
if(findUser != null)
findUser.setName("lisi");
userDao.update(findUser);
Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();
else
Toast.makeText(MyApplication.getContext(), "用户不存在", Toast.LENGTH_SHORT).show();
把zhangsan改成lisi
4、查询
List<User> userList = userDao.queryBuilder()
.where(UserDao.Properties.Id.notEq(1))
.limit(5)
.build().list();
查询语句是数据库操作最多的,语句也比较复杂,具体的语句请去看官网
简单封装
其实这样写代码,作为程序员并不能满足,最起码的重用还是需要的,所以简单的封装一下吧
我们需要添加几个类来负责代码的重用工作,先看一下整体的工程结构:
1、MyApplication:返回Context对象
2、DaoManager:初始化数据库,获取相应的操作对象
3、EntityManager:对数据库表的初始化,获取实体类的操作对象
public class MyApplication extends Application
private static Context mContext;
@Override
public void onCreate()
super.onCreate();
mContext = getApplicationContext();
public static Context getContext()
return mContext;
/**
* greenDao管理类
*/
public class DaoManager
private static DaoManager mInstance;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private DaoManager()
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);
DaoMaster mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
mDaoSession = mDaoMaster.newSession();
public DaoMaster getMaster()
return mDaoMaster;
public DaoSession getSession()
return mDaoSession;
public static DaoManager getInstance()
if (mInstance == null)
mInstance = new DaoManager();
return mInstance;
public class EntityManager
private static EntityManager entityManager;
public UserDao userDao;
/**
* 创建User表实例
*
* @return
*/
public UserDao getUserDao()
userDao = DaoManager.getInstance().getSession().getUserDao();
return userDao;
/**
* 创建单例
*
* @return
*/
public static EntityManager getInstance()
if (entityManager == null)
entityManager = new EntityManager();
return entityManager;
三个东西一看便知,但是这个东西怎么用呢?
// TODO: 2017/1/1 一句话就把相应的数据库表的实例返回,进行操作
UserDao userDao = EntityManager.getInstance().getUserDao();
User user1 = new User(null,"zhangsan");
userDao.insert(user1);
DaoManager和EntityManager主要作用是对数据库和表的初始化工作抽出来作为复用,在Activity中使用的时候,我们可以直接操作表,不需要在初始化工作了,这篇文章作为我的学习笔记,希望也能为看到的朋友提供帮助!
以上是关于GreenDao3.0使用详解的主要内容,如果未能解决你的问题,请参考以下文章