安卓开发可以使用的ORM框架有很多,最近做的项目中,我就初次使用了Greendao这一款,怎么说,框架这东西都是封装后求方便的,所以大部分都是很好用的,这里我也不准备评价,大同小异嘛,我主要想说一下,自己在使用greendao时遇到的小问题和一些总结。
框架的搭建和使用配置相关的信息,大家可以去看看其他的资料,网上有很多。因为我也是第一次使用这个框架,最初也是在网上学习到了很多,现在也当是给自己做个总结。
@Entity:实体类注解。在实体类前添加这个注解,编译项目,实体类会自动编译,生成get、set方法并且会在com.greendao.gen目录下生成三个文件,DaoMaster 、DaoSession、Dao类;如:
@Entity
public 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;
这两个注解基本就是必备的了,大部分情况下就已经够用了,很方便。
这个基本是所有数据库的使用的基本了,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 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 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 transactions = nQuery.where(TraDao.Properties.Date.eq(sdate))
.orderDesc(TransactionEcardDao.Properties.Time).list();//查询某一日期数据并根据时间递减排