GreenDao3.0使用时的心得体会

来源:互联网 发布:h3c基于acl的端口镜像 编辑:程序博客网 时间:2024/05/21 20:29

安卓开发可以使用的ORM框架有很多,最近做的项目中,我就初次使用了Greendao这一款,怎么说,框架这东西都是封装后求方便的,所以大部分都是很好用的,这里我也不准备评价,大同小异嘛,我主要想说一下,自己在使用greendao时遇到的小问题和一些总结。

框架的搭建和使用配置相关的信息,大家可以去看看其他的资料,网上有很多。因为我也是第一次使用这个框架,最初也是在网上学习到了很多,现在也当是给自己做个总结。

注解

@Entity:实体类注解。在实体类前添加这个注解,编译项目,实体类会自动编译,生成get、set方法并且会在com.greendao.gen目录下生成三个文件,DaoMaster 、DaoSession、Dao类;如:

@Entitypublic class User {    private int sex;    private String name;    @Generated(hash = 756500433)    public User(int sex, String name) {        this.sex = sex;        this.name = name;    }    public int getSex() {        return this.sex;    }    public void setSex(int sex) {        this.sex = sex;    }    public String getName() {        return this.name;    }    public void setName(String name) {        this.name = name;    }}

这样使用,如果配置正确,编译后数据库中就会有对应类名的表,并且实体类属性作为表字段属性。

@Id(autoincrement = true):这个是注解主键的,括号中的true表示自增,当然false就是不自增的了。

如:

@Id(autoincrement = true)    private Long Id;    private String termsn;    

需要说明的是 主键必须是Long型的!

这两个注解基本就是必备的了,大部分情况下就已经够用了,很方便。


操作(增删改查)

这个基本是所有数据库的使用的基本了,greendao的增删改查也是封装后的方法,当然也是支持原生SQL语句的,有兴趣想深入了解学习的可以去找找相关的资料,我这里想说下自己使用其封装的操作的心得。(建议每个表中都设置主键,可以是已存在的属性,也可以增加一个自增长的Long型Id)



whiteListDao.insertOrReplaceInTx(whitelists);//顾名思义,存在则替换,否则插入,这是一个集增加与修改于一体的方法,并且支持集合插入,需要注意的是必须存在主键whiteListDao.insertInTx(whitelists);//有序插入,支持集合transactionDao.insert(transaction);//直接插入,不需要主键也行

transactionDao.delete(transaction);transactionDao.deleteByKey(transaction);//根据主键删除transactionDao.deleteAll();//删除表中所有数据

主要使用的就是Update,如

transactionDao.update(transaction);

最复杂,也最多样的就是这里了,查询操作,我个人认为是最具有灵魂的,性能、安全、效率、简洁等等都能从中体现。

我在使用greendao时,主要使用的是它的where查询,

//查询某一天数目为5的那批进货数据:Query<T> nQuery = transactionDao.queryBuilder()                .where(TraDao.Properties.Date.eq(date))//查询某一日期                .where(TraDao.Properties.Num.eq(5))                .build();        if (nQuery != null && nQuery.list() != null && nQuery.list().size() > 0) {            List<T> transactions = nQuery.list();        }

where查询可以连查,如上,在使用where后可再接查询,理论上无限制,也可使用组合嵌套查询,这里引用下官方文档的例子:

//查询条件表达为:名是Joe AND(生日的年份大于1970 OR(生日的年是1970 AND 生日的月等于或大于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();

值得注意的是,eq后面的参数可以是字符串、整型,但是gt(大于)、ge(大于等于)还有lt、le(小于等于)后面只有整型时才起作用,不清楚原因,

实测是这样,也可能是我有什么地方不对。


另外,loadByRowId(int i);//通过行号查询某一行数据(行号从1开始)

            loadAll();//查询所有数据

当然,在查询结果后面也可以进行排序相关处理,如:

List<T> transactions = nQuery.where(TraDao.Properties.Date.eq(sdate)).orderDesc(TransactionEcardDao.Properties.Time).list();//查询某一日期数据并根据时间递减排


总结


使用ORM框架可以帮助我们更快速的进行开发工作,使用时也很简单、方便,在进行一些简单的数据库操作时,其对外封装的操作方法也更容易让我们调用,
效率、性能优化都得到提高,但是在处理一些较复杂的查询操作时,显然只靠封装的方法是远远不够的,或者说使用起来会比较累赘,但是这个时候又不能临时
改框架,那么方法就一个,自定义查询语句,也就是我们上面提到的,支持原生SQL语句查询,这时考验的就是各位的能力了,这里我不多说了,不敢班门弄斧。

好了,第一次使用greendao,然后对自己用到的知识做了下总结,认识可能不全面也不到位,有什么问题望各位指点,谢谢各位。


原创粉丝点击