Android开发随笔1:好用的SqlLite封装“ActiveAndroid”

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());

源码在这里
https://github.com/pardom/ActiveAndroid/blob/08c6335cd7324c6e72da536b0c6fffa5a798f6a2/src/com/activeandroid/Cache.java

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容