GreenDAO使用
一、greenDao简介
简单地讲,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
二、GreenDao设计的主要目标:
1. 一个精简的库
2. 性能最大化
3. 内存开销最小化
4. 易于使用的APIs
5. 对Android进行高度优化
三、greenDao的使用
1.需要的jar包:greendao-generator.jar和greendao.jar
Gradle配置:compile 'org.greenrobot:greendao-generator:3.2.0'
compile'org.greenrobot:greendao:3.2.0'
2.生成工具类
2.1一个普通的java工程,添加greendao-generator.jar包。
2.2 添加一个类,在主函数中创建自己所需要的表结构:
packagecom.example;
importorg.greenrobot.greendao.generator.DaoGenerator;
importorg.greenrobot.greendao.generator.Entity;
importorg.greenrobot.greendao.generator.Property;
importorg.greenrobot.greendao.generator.Schema;
public class MyClass{
public static void main(String[] args) {
// Schema构造函数中第一个参数为数据库版本,第二个参数为生成类的包名
Schema schema = new Schema(1,"com.example.hps.greendaodemo1");
// 新建一个实体,对应一张表
Entity son =schema.addEntity("Son");
// 添加主键
son.addIdProperty();
// 其他字段
son.addStringProperty("name");
son.addIntProperty("age");
Entity father =schema.addEntity("Father");
father.addIdProperty();
father.addStringProperty("name");
father.addIntProperty("age");
// 添加外键
Property sonId =father.addLongProperty("sonId").getProperty();
// 一对一关系
father.addToOne(son, sonId);
// 一对多的关系
son.addToMany(father,sonId).setName("Fathers");
try {
newDaoGenerator().generateAll(schema, "app/src/main/java");
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述主函数中定义了两张表结构,Son和Father(注意Entity的首字母必须大写), Father表有一个外键sonId, son和father是一对多关系。执行上述主函数后,会生成如下几个类:
将这些类拷贝到自己的android工程,即可对进行数据库相关操作。
2.3 在android工程中使用greenDao操作数据库。
(1)打开数据库:
private voidopenDb() {
// DevOpenHelper的3个参数分别为上下文,数据库名,游标工厂
db = newDaoMaster.DevOpenHelper(MainActivity.this, "person.db",null).getWritableDatabase();
master = new DaoMaster(db);
session = master.newSession();
sonDao = session.getSonDao();
fatherDao = session.getFatherDao();
Toast.makeText(MainActivity.this,"db is opened", Toast.LENGTH_SHORT).show();
}
打开数据库后,可以通过sonDao和fatherDao对两个表进行增删改查
(2)插入:
Son son = new Son();
son.setName("nate");
son.setAge(23);
sonDao.insert(son);
新建一个实体son,赋值后通过sonDao.insert()方法即可插入到数据库中
(2)更新:
sonDao.insertOrReplace(item);
其中item为Son对象,调用sonDao的insertOrReplace()方法,如果数据库中存在,则更新该条记录,如果不存在,则执行插入操作。
(3)删除:
sonDao.deleteByKey(id);
sonDao.deleteAll();
sonDao.deleteInTx(sons);
删除的3种方式,其中deleteByKey(id)是根据主键进行删除,deleteAll()将删除表中的所有数据,deleteInTx(sons)是根据集合进行批量删除,该集合须实现Iterator接口。
(4)查询:
查询所有:
sonDao.queryBuilder().list();
sonDao.queryBuilder().listLay();
sonDao.queryBuilder().listLazyUncached()
sonDao.queryBuilder().listIterator()
上面四种方法都可以查询所有记录,后面三种可以延迟加载,只是在自己需要取数据的时候进行查询,后面两种必须关闭游标。
等于查询:
sonDao.queryBuilder().where(SonDao.Properties.Name.eq("John")).unique();
上面是从son表中查询name=”John”的记录,后面的unique()表示查询记录只有一条,如果有多条则会抛异常,这时可换成list();
Like模糊查询:
sonDao.queryBuilder().where(SonDao.Properties.Name.like("%Tom%")).list();
查询name中包含“Tom”的记录。
Between查询:
sonDao.queryBuilder().where(SonDao.Properties.Age.between(20,30)).list();
查询年龄在20到30岁的记录。
大于查询:
sonDao.queryBuilder().where(SonDao.Properties.Age.gt(20)).list();
查询年龄大于20的记录,同理小于为lt, 不等于为notEq.
排序查询:
sonDao.queryBuilder().where(SonDao.Properties.Age.notEq(20)).orderAsc(SonDao.Properties.Age).list()
上述语句查询年龄不等于20的记录并根据年龄进行升序排序,降序为orderDesc()
自定义sql查询:
sonDao.queryBuilder().where(newWhereCondition.StringCondition("FATHER_ID IN "
+"(SELECT _ID FROM FATHER WHERE AGE < 60)")).list()
如果查询条件比较复杂,则自己可以自定义查询条件,但前面Select * from son Where是固定的,不能修改。
一对一查询:
由于father表与son表是一对一关系,则可以
List<Father> fatherList =fatherDao.queryBuilder().list()
For(Father father:fatherList) {
Son son =father.getSon();
}
通过上述语句可以进行一对一查询
一对多查询:
List<Son> sonList = sonDao.queryBuilder().list();
for (Sonson: sonList) {
List<Father> fatherList = son.getFathers();
for(Father father: fatherList) {
Log.i("nate", "query called with son: " +son.getName() + ", father:" + father.getName());
}
}
son表与father表是一对多关系,可以通过Son的getFathers方法进行一对多查询。
多线程查询
final Query query = sonDao.queryBuilder().build();
newThread() {
@Override
publicvoid run() {
List data = query.forCurrentThread().list();
Log.i("nate" , "queryAll() called with " +data.toString());
}
}.start();
GreenDao在执行多线程查询时,必须先调用forCurrentThread方法。