开源库ActiveAndroid + gson使用

ActiceAndroid的简介

ActiveAndroid是一个活跃的记录风格的ORM(对象关系映射)库。ActiveAndroid可以让您保存和检索的SQLite数据库记录而没有写一个SQL语句。每个数据库记录被整齐包裹成一个model类,像保存方法()和delete()。

AA使用教材:https://github.com/pardom/ActiveAndroid/wiki/Getting-started

AA在数据库save,select动作中,只能处理基本数据类型,int,long,String等,对于自定义类型,则需要使用TypeSerializer类型串行化。AAapi中也实现好几种TypeSerializer。

问题1:AA结合gson使用

Gson  gson = new Gson();
Log.d("ActiveAndroid","item toJson:"+gson.toJson(obj));//obj继承com.activeandroid.Model;

会出现报对象序列化异常:

这是由于ActiveAndroid框架需要模型继承com.activeandroid.Model类,而这个类貌似不能序列化,具体原因未深究,有兴趣的同学可以看看ActiveAndroid的源码。
在ActiveAndroid的Git上查阅了Issue后,发现有开发者遇到类似问题,但没有有效解决办法。

网上解决方案:我们在序列化时忽略父类(com.activeandroid.Model)的属性,实现com.google.gson.ExclusionStrategy接口策略来构建gson,可以解决这个序列化问题。

public class ActiveAndroidStrategy  implements ExclusionStrategy {

    private Class<?> excludedThisClass;
    private Class<?> excludedThisClassFields;

    public ActiveAndroidStrategy(Class<?> excludedThisClass, Class<?> excludedThisClassFields){
        this.excludedThisClass = excludedThisClass;
        this.excludedThisClassFields = excludedThisClassFields;
    }

    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        return f.getDeclaringClass().equals(excludedThisClassFields);
    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        if(clazz == null){
            return  false;
        }

        if(clazz.equals(excludedThisClass)){
            return true;
        }
        return shouldSkipClass(clazz.getSuperclass());
    }

}

构建gson

 Gson  gson = new GsonBuilder().setExclusionStrategies(new ActiveAndroidStrategy(null, Model.class)).serializeNulls().create();
 Log.d("ActiveAndroid","item toJson:"+gson.toJson(obj));

问题二

对ActiveAndroid自定义model类型,或者model的集合作为一实体的属性,没有使用TypeSerializer,保存到数据中的值为空。

举例:实体item 中含有自定义实体 Category,ChildItem集合

@Table(name ="Items")
public class Item extends Model{
    @Column(name = "Name")
    public String name;
    @Column(name = "Category")
    public Category category;
    @Column(name = "ChildItems")
    public List<ChildItem> childItems;

    }

从数据库读取items中的数据打印:

category,childItems值为空,注意值为null,而不是空字符串,是友构建gson对象,调用serializeNulls()。

解决方案:对于引用类型的字段,保存到数据库中我们习惯保存为json格式字符串,读取时,把字符串转为相应的引用类型对象,TypeSerializer接口正好完成这样的工作。

public abstract  class Serializer extends TypeSerializer{
    protected Gson gson =  new GsonBuilder().setExclusionStrategies(new ActiveAndroidStrategy(null, Model.class)).create();
    //序列化后的Class类型
    @Override
    public Class<?> getSerializedType() {
        return String.class;
    }
        //序列化为String
    @Override
    public Object serialize(Object data) {
        if(data == null){
            return null;
        }
        return  gson.toJson(data);
    }
}

//自定义的实体序列化器接口

public class CategorySerializer extends Serializer {


//反序列化后的类型
public Class<?> getDeserializedType() {
return Category.class;
}


//反序列化为Category对象
public Object deserialize(Object data) {
if(data == null){
return null;
}
return gson.fromJson((String)data,Category.class);
}


}

//实体集合序列化器

public class ListSerializer extends Serializer{
@Override
public Class<?> getDeserializedType() {
return List.class;
}

@Override
public List deserialize(Object data) {
if(data == null){
return null;
}
return gson.fromJson((String)data,new TypeToken<List<ChildItem>>() {
}.getType());
}

}

 
在AdnroidMinatest.xml中添加元数据TypeSerializer

<meta-data android:name="AA_SERIALIZERS" android:value="com.sihaixuan.practice.test.entity.CategorySerializer
,com.sihaixuan.practice.test.entity.ListSerializer"/>


从数据库中读取items,测试结果如下:

可以看到category,和childItems都值了。

使用AA小小的抱怨:

1.AA中绝大数类都是final,开放的接口少,可定制性低,比如我想动态添加TypeSerializer,就不行了,暴力点,只能通过反射实现了。

2.假如实体很多时,或者使用的实体集合类型很多时,TypeSerializer类会不会膨胀了,有什么好的方法避免了。

测试demo:http://pan.baidu.com/s/1dDepZwt

时间: 2024-11-10 01:18:14

开源库ActiveAndroid + gson使用的相关文章

Android开发者必知的5个开源库

http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries 过去的时间里,Android开发逐步走向成熟.而无论出现多少Android相关的开发工具,我们每天使用的大量开源库却始终是不可或缺的.这里,向大家介绍的是,这个任劳任怨的大家庭中,最受开发者喜爱的五个Android库. 过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷.不过,在面对各种新鲜事物时,不要忘了那些我们

GitHub Top 100的Android开源库

本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best Match」得到的结果,然后过滤了跟Android不相关的项目,所以排名并不具备任何官方效力,仅供参考学习,方便初学者快速了解当前一些流行的Android开源库. 1. React Native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native,

【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位...

[转]http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会 不定期的更新 这篇文章. Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以关注我的博客,每一个库都是我认真查看或者编译运行

100个Github上Android开源库

项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, 该框架结合了 Web 应用和 Native 应用的优势, 可以使用 JavaScript 来开发 iOS 和 Android 原生应用 2.Android-Universal-Image-Loader ImageLoader 是最早开源的 Android 图片缓存库, 强大的缓存机制, 早期被广泛

Android之史上最全最简单最有用的第三方开源库收集整理

Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会 不定期的更新 这篇文章. Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以关注我的博客,每一个库都是我认真查看或者编译运行的,希望对你产生帮助. 原文: http://blog.csdn.net/caoyou

Android 网络开源库之-retrofit的解析详解

前言 当前的网络开源库有许多,如volley,okhttp,retrofit等,这三个库当前是比较火的,其中,okhttp和retrofit由square团队开发.关于这三个库的区别,请移步stackoverflow或者知乎查看.开发过程中选择什么样的开源库需要更具我们APP来做出选择.我们选出stackoverflow中的一段话来看下. 上面说,需要与web service通信的时候,我们使用retrofit.百度百科 web service介绍,那么我们见天就来了解下retrofit.

Android 第三方开源库收集整理(转)

原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会 不定期的更新 这篇文章. Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以关注我的博

GitHub开源库排名一百的简单介绍,值得收藏!

GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. iOS 版本的在此: https://github.com/Aufree/tri

Android开发之常用开源库直接拿来用

1.from  代码家 整理比较好的源码连接 *************************************************************************************************************************************************************************** http://blog.zhan-dui.com/?page_id=60 感谢 "代码家"整理 一.