Android开源:数据库ORM框架GreenDao数据库查询解析
android开源:orm框架greendao数据库查询解析。
1. 查询 -- queries
1)你可以使用原生的sql(raw sql)语句;
2)也可以使用推荐的方法:使用greendao提供的querybuilder的api。
3)查询还支持结果延迟加载(lazy-loading),主要为操作较大查询结果是节约内存并提高性能。
(1)querybuilder
使用过sql语句查询的人都会有一种感触(主要针对不是专职开发数据库并对sql不是很熟练的人),写起来复杂、不能再第一时间发现问题(只能在运行过程中验证sql的正确性)、查找bug麻烦等等。querybuilder的出现就是为了解决sql使用的问题,提高开发效率。
看一个略微复杂的例子,查询first name是joe,并在1970年10月以及之后的所有人:
querybuilder qb=userdao.querybuilder();
qb.where(properties.firstname.eq("joe"),
qb.or(properties.yearofbirth.gt(1970),
qb.and(properties.yearofbirth.eq(1970),properties.monthofbirth.ge(10))));
listyoungjoes=qb.list();
不用我来解释了吧。
(2)lazylist
greendao支持返回唯一查询结果(如果没有返回null) ---- 调用query或querybuilder的unique()方法;
也支持返回list ---- 调用list()方法。
当不希望返回null作为结果时,则调用uniqueorthrow()方法,当结果null时将直接抛出异常。
返回多个结果解释:
list(): 所有entity均会被加载到内存中。结果仅是一个简单的arraylist。使用最简单。
listlazy(): 查询结果会根据需要加载到内存中。列表中的元素仅在accessed for the first time,它才会被加载并缓存。该方法必须主动关闭(must be closed)。
listlazyuncached(): 虚拟的结果列表,任何对元素的方法实际都会到数据库中去加载数据。must be closed
listiterator(): 根据需要迭代结果(lazily)。数据不缓存。must be closed
在greendao实现中,后3中其实都使用的lazylist类。为了实现根据需要加载,其内部实现上是保存了数据库cursor的引用。这也是为何这3中方式must be closed,其就是为了释放内部cursor和迭代器(通常是在try-finally块中完成close)。
(3)query
解释:query类代表了一个可以被重复执行的查询。在querybuilder内部其实也是会定义一个query并执行完成查询。
这将带来极大地方便,因为任何人都不希望在每次查询的时候总是写一遍query代码。同时query还可以根据需要改变参数。如下实例代码:
使用query对象查询名为joe并出生在1970年的人:
query query=userdao.querybuilder().where(
properties.firstname.eq("joe"),properties.yearofbirth.eq(1970))
.build();
listjoesof1970=query.list();
然后想再查询出生在1977年之后并叫marias的人:
query.setparameter(0,"maria");
query.setparameter(1,1977);
listmariasof1977=query.list();
注意:参数的编号是创建query所设置的顺序。
(4)多线程查询
有时我们希望在多线程中执行查询。从greendao 1.3版本开始,实例化query对象均会绑定到其自己的线程,这样我们就可以安全的设置query参数,因为其他线程无法影响到。如果其他线程使用别的线程的query(比如设置参数、执行查询)将会抛出异常。因此,我们也不需要做同步工作,而且不要加锁,因为加入相关的事务用到了该query对象将导致死锁。
为完全地避免可能产生的死锁,1.3版本引入了forcurrentthread()方法。该方法将返回本线程内的query实例,每次调用该方法时,参数均会被重置为最初创建时的一样。
(5)原生sql查询
推荐的方法执行原生sql语句是通过querybuilder和wherecondition.stringcondition。如下代码:
query query=userdao.querybuilder().where(
newstringcondition("_id in "+"(select user_id from user_message where read_flag = 0)").build();
假如querybuilder没有提供你需要的特性,你也可以使用queryraw() 和 queryrawcreate() 方法。具体就不再详细介绍了。
(6)删除操作(delete query)
删除操作会删除所有满足条件的实体。为实现批量删除(bulk delete),调用querybuilder的builddelete方法并执行deletequery。该部分api还不稳定,可能会改变就不介绍了。
(7)问题定位(日志)
你可能会遇到查询结果并不是预期的那样,这时候你就可以设置两个静态flag参数来打日志定位问题:
querybuilder.log_sql=true;
querybuilder.log_values=true;
这将会将产生的sql命令以及传递的参数以日志方式输出,由此方便程序员定位问题。
推荐阅读
-
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
-
Android开源:数据库ORM框架GreenDao数据库查询解析
-
Android中数据库操作框架(ActiveAndroid、ormlite、greenDAO、DBFlow、Realm)介绍及使用详情
-
Android开源:数据库ORM框架GreenDao数据库查询解析
-
在 Laravel 框架之外使用数据库查询构建器及 Eloquent ORM
-
Android开源:数据库ORM框架GreenDao封装工具类使用
-
Android中数据库操作框架(ActiveAndroid、ormlite、greenDAO、DBFlow、Realm)介绍及使用详情
-
在 Laravel 框架之外使用数据库查询构建器及 Eloquent ORM