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

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

  1. Android开源库--ActiveAndroid(active record模式的ORM数据库框架)

    Github地址:https://github.com/pardom/ActiveAndroid 前言 我一般在Android开发中,几乎用不到SQLlite,因为一些小数据就直接使用Preferen ...

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

    摘要:过去的时间里,Android开发逐步走向成熟.而无论出现多少Android相关的开发工具,我们每天使用的大量开源库却始终是不可或缺的.这里,向大家介绍的是,这个任劳任怨的大家庭中,最受开发者喜爱 ...

  3. 2019最新Android常用开源库总结(附带github链接)

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 1.TextView HTextView ...

  4. Android 常用开源库总结(持续更新)

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...

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

    [原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http: ...

  6. 100个Github上Android开源库

    项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...

  7. iOS项目中常用的第三方开源库

    1.项目使用的第三方开源库 项目使用了CocoaPods(类似java中的maven)管理常用的第三方库,一些特殊的单独引用,下面介绍下比较好用的几个. (1)AFNetworking 目前比较推荐的 ...

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

    原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样,  ...

  9. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

随机推荐

  1. shell 定义变量

    注意定义变量的语法: var="ABC" 等号之间不能有空格,否则会报错

  2. Appium-关于appium的原生控件的 xpath 定位问题及常用方法

    最近遇到的项目,发现很多元素,都没有标明id.text.content-desc,classname中又有很多是相同,导致无法定位 第一,appium1.5及之后的版本废弃了name属性(如name= ...

  3. L104

    marsh:It was like my own marsh country, flat and monotonous.The government will take more measures t ...

  4. leetcode 3 Longest Substring Without Repeating Characters(滑动窗口)

    用滑动窗口的思想来做.用一个unordered_map来查询之前的char有没有在现在的窗口中. class Solution { public: int lengthOfLongestSubstri ...

  5. ffmpeg avpicture_fill的一些使用

    标签: ffmpegavpicture_fill 2013-05-17 10:03 4713人阅读 评论(1) 收藏 举报  分类: ffmpeg(3)  这个FFMPEG我没找到详细的中文教程,只有 ...

  6. bzoj 4771: 七彩树 树链的并+可持久化线段树

    题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了. 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. ...

  7. UILabel的富文本显示选项

    UILabel的富文本格式设置 1.实例化方法和使用方法 实例化方法: 使用字符串初始化 - (id)initWithString:(NSString *)str; 例: NSMutableAttri ...

  8. 记一次肉机事件--yam

    背景: 研发同事反应他自己的测试机器,有一个yum程序占用cpu很多,接近100%,然后他就将这个程序kill了.我一看他给我发的截图,原来不是“yum”,而是“yam”,第一反应就是让人当肉机了.上 ...

  9. 添加一个用户并且让用户获得root权限

    1.创建一般用户: 完全参考默认值创建一个用户, 一般账号UID应该是500以后的. 默认会创建用户家目录和账号一模一样的群组名.创建使用账号且给予口令才算完成了用户的创建流程. useradd us ...

  10. Ruby迭代器(Iterator)

    简单的讲,一个迭代器就是一个能接受代码块的方法.当初为了进行迭代操作而设置了带块方法,现在很多时候仍然称它为迭带器. 可实际上,早期版本的 Ruby 将使用代码块的方法称为迭代器,因为它们就是被设计来 ...