ActiveAndroid 真是不错,安卓Sqllite 操作的AR封装。
通用的配置、增伤查改数据,github官方有详细的资料,写几个项目中用到的点,官网没提到的。
1.统计一个表 的总数:
理所当然的认为是int cnt = new Select().from(Model.class).count() 结果不是
以为是 Model mdel = new Select("count(id)").from(Model.class).as('cnt').executeSingle(); 结果也不是
没翻源码,最后找到如下方法获取一个表的总行数
private int getCnt(Model model){
new Select().from(Post.class).executeSingle();
String sql = "SELECT COUNT(*) as total FROM " + model.getTableName();
Cursor c = ActiveAndroid.getDatabase().rawQuery(sql, null);
int cnt = 0;
if(c!= null && c.getCount() > 0){
c.moveToNext();
cnt = c.getInt(0);
}
c.close();
return cnt;
}
2.获取insert_id
理所当然的认为会有一个insert_id() 方法可以调用,结果没有。
在save之后,在select查询一次,获取id,也可以,不过太痛苦。
最后发现,其实很简单
model.save() 之后model的id就已经被赋值了,直接使用即可
Model model = new Model();
model.a = "a";
model.save();
Log.d("TAG" , model.getId());
3.ActiveAndroid 3.0 在安卓5.0以上,会有无法找到类的错误
java.lang.NoClassDefFoundError: android.support.v4.hardware.fingerprint.FingerprintManagerCompatApi23$1
解决方法有两种:
一种是在Manifest 中声明
<meta-data android:name="AA_MODELS" android:value="com.xxl.app.timer_jonrnal.active.Image,com.xxl.app.timer_jonrnal.active.Poi,com.xxl.app.timer_jonrnal.active.Post,com.xxl.app.timer_jonrnal.active.Voice,com.xxl.app.timer_jonrnal.active.ZipData," />
我自己试验了一下,没解决问题
第二种是升级到AA3.1,github上有个jar包提供下载,可以解决此问题。但升级AA3.1 又遇到两个问题
java.util.Date类型无法正确的存取
model.getTableName() 函数没了
不得已看下代码,解决以上两问题:
第一,Date 在AA3.1中不会默认被序列化,需要自己写TypeSerializer
具体见下代码save方法
https://github.com/pardom/ActiveAndroid/blob/08c6335cd7324c6e72da536b0c6fffa5a798f6a2/src/com/activeandroid/Model.java
第二,Model类中没有getTableName 函数了,移到Cache类中
String sql = "SELECT COUNT(*) as total FROM " + Cache.getTableName(model.getClass());