关于GreenDao的初步使用

来源:互联网 发布:linux python vim 编辑:程序博客网 时间:2024/05/16 03:20

    GreenDao是目前比较火的关于Sqlite的第三方开源框架,官网地址是http://greendao-orm.com/。

   官网的介绍:

 greenDAO的主要设计目标
    最高性能可能是Android最快的ORM
    易于使用的API
    高度Android优化
    最小的内存占用
    很小专注于要领

1. 下载源代码

https://github.com/greenrobot/greenDAO

源码有主要5个包:

其中DaoExanple,DaoExampleGenerator,DaoTest是java工程,导入的时候注意。DaoCore就相当于整个源码了。

导入之后运行DaoExample可以看到效果。

2. 前言

下载github的源码之后还需要到官网去下载另外3个jar包,其中两个jar包是这里下载http://search.maven.org/#search|ga|1|greendao:

另外一个需要到这里下载:http://search.maven.org/#search|ga|1|freemarker:


选择一个最新版本的。

其中greendao-generator-1.3.1和freemarker-2.3.21这两个jar包导入DaoExampleGenerator和DaoGenerator这两个java项目。

3. 初步使用

最重要的就是DaoExampleGenerator项目中的ExampleDaoGenerator类,它会自动生成实体类和dao类到你的项目。

(1)首先是这一段,其中"../DaoExample/src-gen"就是../你项目的名称/文件夹路径,在运行之前需要先在你项目中创建src—gen文件夹,否则会报错。
 new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");
(2)然后是这一段,前面的参数是数据库版本号,后面的是上面创建的src—gen文件夹下面的包
Schema schema = new Schema(1000, "de.greenrobot.daoexample");
(3)这一段就是所产生的实体类了,修改好自己需要的属性,就可以在运行这个类了,右键→run as→java application,然后神奇的事情就发生了,官网项目中的src—gen下面产生了8个类,其中DaoMaster和DaoSession是一定会产生的,另外六个是三个实体类以及它们的dao。
 private static void addNote(Schema schema) {        Entity note = schema.addEntity("Note");        note.addIdProperty();//主键,long类型        note.addStringProperty("text").notNull();//添加字符串类型的字段        note.addStringProperty("comment");        note.addDateProperty("date");//添加日期类型的字段    }

(4)之后就可以方便的使用Greendao了,这是官网的api:

①Android项目中的api:http://greendao-orm.com/javadoc/greendao/

②java项目中的api:http://greendao-orm.com/javadoc/greendao-generator/

3. Android项目使用

(1)查询 -- Query

    1)你可以使用原生的SQl(raw sql)语句;

    2)也可以使用推荐的方法:使用greenDAO提供的QueryBuilder的API。

    3)查询还支持结果延迟加载(lazy-loading),主要为操作较大查询结果是节约内存并提高性能。

查询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))));    List youngJoes = 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)删除操作(delete query)

    删除操作会删除所有满足条件的实体。为实现批量删除(bulk delete),调用QueryBuilder的 buildDelete方法并执行DeleteQuery。该部分API还不稳定,可能会改变就不介绍了。

(4)原生sql查询

    推荐的方法执行原生sql语句是通过QueryBuilder和WhereCondition.StringCondition。如下代码:

    Query query = userDao.queryBuilder().where(    new StringCondition("_ID IN " + "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();

    假如QueryBuilder没有提供你需要的特性,你也可以使用queryRaw() 和 queryRawCreate() 方法。具体就不再详细介绍了。


(5)问题定位(日志

    你可能会遇到查询结果并不是预期的那样,这时候你就可以设置两个静态flag参数来打日志定位问题:

        QueryBuilder.   LOG_SQL       =       true   ;         QueryBuilder.   LOG_VALUES       =       true   ; 

    这将会将产生的sql命令以及传递的参数以日志方式输出,由此方便程序员定位问题。









0 0
原创粉丝点击