可以先上官网看下对于GreenDao的介绍,以及为什么使用greendao。
greenDAO is an object/relational mapping (ORM) tool for Android. It offers an object oriented interface to the relational database SQLite. ORM tools like greenDAO do many repetitive tasks for you and offer a simple interface to your data.
greenDAO是Android的对象/关系映射(ORM)工具。它为关系数据库SQLite提供了面向对象的接口。像greenDAO这样的ORM工具可以为您完成许多重复性任务,并为您的数据提供简单的界面。
并且目前greendao是android ORM(对象关系映射)框架中速度最快,效率最高的一个数据库操作框架。
// In your root build.gradle file:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
implementation 'org.greenrobot:greendao:3.2.2' // add library
}
另外最好在app的build.gradle中加入数据库版本,另外一些参数也可按照自己喜好编辑。
// In the build.gradle file of your app project:
android {
...
}
greendao{
schemaVersion 2 //数据库版本号
// daoPackage //生成的DAO,DaoMaster和DaoSession的包名称。默认为源实体的包名称。
//targetGenDir //生成DaoMaster,DaoSession,Dao的目录路径。默认为构建目录(build / generated / source / greendao)中生成的源文件夹。
// generateTests //设置为true以自动生成单元测试
//targetGenDirTests //生成单元测试存储的基本目录。默认为src / androidTest / java。
}
这样子就配置完了GreenDao了。
新建一个实体类
@Entity
public class User {
@Id
private Long id;
private String name;
@Transient
private int tempUsageCount; // not persisted
// getters and setters for id and user ...
}
关于注解的解释:
Entity注释将Java类标记为greenDAO的可预设实体。即生成数据库中的一个表
Id注释选择long / Long属性作为实体ID。在数据库方面,它是主键。参数autoincrement是一个标志,用于使ID值不断增加(不重用旧值)。
@Property
设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = “userName”)
@NotNull
设置数据库表当前列不能为空
@Transient
添加此标记后不会生成数据库表的列
@Unique
表名该属性在数据库中只能有唯一值
@ToMany
定义一对多个实体对象的关系
@ToOne
表示一对一关系
@OrderBy
更加某一字段排序 ,例如:@OrderBy(“date ASC”)
然后make project。默认生成的目录在
生成了DaoMaster,DaoSession,UserDao这三个类。
DaoMaster:使用greenDAO的切入点。 DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。 DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。最后,DaoSession对象还跟踪身份范围。
DAO:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法
private DaoMaster master;
private DaoSession daoSession;
private SQLiteDatabase db;
private UserDao userDao;
db = new DaoMaster.DevOpenHelper(MainActivity.this,"test.db",null).getWritableDatabase();
master = new DaoMaster(db);
daoSession = master.newSession();
userDao = daoSession.getUserDao();
//看生成的代码可以发现,DevOpenHelper继承了DatabaseOpenHelper,所以可以使用getWritableDataase
所以应该先通过DaoMaster的DevOpenHelper方法来创建一个数据库,然后再获得一个db,通过新建一个DaoMaster,获得master,再通过master new一个Daosession,接着通过session get到一个可操作数据库的实体类dao。
插入数据:
User user = new User();
user.setName("sss");
user.setAge(15);
userDao.insert(user);
查询数据
使用greendao的查询
List userList = userDao.queryBuilder().list();
for (User user:userList) {
Log.d("user","query all "+ user.getName());
}
如果是一对一,一对多,多对多的关系,那么该方法会把相对应的表的对象也会加载进内存,不是很好。
例如一个son表和father表,一个son对应一个father(son中有father的外键),对son使用该方法,会把father也加载金内存。
这个按需是你需要访问哪个数据就会加载哪个数据(延时加载),该方法就避免了list方法的缺点,提高了应用的性能。
使用该方法必须关闭。
LazyList sonList = sonDao.queryBuilder().listLazy();
for (Son son:sonList) {
Log.d("son","query all "+ son.toString());
}
sonList.close();
关闭方法的原理我们查看源码可以得知,是使用了游标的关闭。
public void close() {
cursor.close();
}
Iterator sonList = sonDao.queryBuilder().listIterator();
while (sonList.hasNext()) {
Son son = (Son) sonList.next();
Log.d("son","query all "+ son.getName());
}
http://greenrobot.org/greendao/documentation/queries/
我们还可以在控制台看进行该查询的时候所对应的SQL语句是怎样。
只需要加入这个就行。
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
查看控制台:
github:https://github.com/callmexiaolu/GreenDaoDemo