ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter
Posted Sunzxyong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter相关的知识,希望对你有一定的参考价值。
在使用GreenDAO定义实体的属性时候,通常来说定义的实体属性名就是对应的表的字段名、实体中属性的类型(如Long、String等)就是表的字段名类型,但是我们难免会有不一样的需求,比如实体中我定义了一个Color类型的属性或者其它自定义类型的属性,而表的字段类型只有一些原始类型肯定是没有这些类型的,所以这时候该怎么办呢?
不用急,GreenDAO给我们提供了一个强大的工具,就是属性转换器:PropertyConverter。这是一个接口,我们使用它可以让实体的属性类型不再局限于原始类型, 可以自定义任何的类型,充分保证了实体的灵活性。既然实体的类型可以是自定义的任何类型,而表中只有一些原始类型,那么自定义类型和原始类型之间怎么进行值的交互呢?这是通过PropertyConverter来进行转换的,它就是相当于一个中间层,让数据在实体中是一种表现形式,而在表中又是另外一种表现形式。所以在进行CRUD的时候我们就可以直接赋值了,转换工作交给PropertyConverter做就好了。
好了,我们来使用一下吧,刚刚说PropertyConverter是个接口,那么要定义一个属性转换器肯定是需要实现这个接口的,实现这个接口是要在android工程中,而这个接口中有两个方法需要实现,为:
public class MyPropertyConverter implements PropertyConverter<String,Long>
@Override
public String convertToEntityProperty(Long databaseValue)
return null;
@Override
public Long convertToDatabaseValue(String entityProperty)
return null;
其中PropertyConverter<P,D>
接口中需要定义两个泛型,意思分别为P:实体中自定义的类型,D:数据库中的类型。
下面通过一个简单的实例来看看具体怎么使用:
假如有一个时间数据,实体类中的类型为String类型(用来直接展示2015-09-16 17:50 星期三
格式的数据),而数据库中的类型为Long类型,用来存放精确的毫秒值,而且需要进行一系列的运算,所以类型肯定是要为Long类型。
我们先来定义一个属性转换器:
public class MyPropertyConverter implements PropertyConverter<String,Long>
@Override
public String convertToEntityProperty(Long databaseValue)
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm EEEE", Locale.CHINA);
String result = format.format(new Date(databaseValue));
return result;
@Override
public Long convertToDatabaseValue(String entityProperty)
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm EEEE", Locale.CHINA);
Long result;
try
Date date = format.parse(entityProperty);
result = date.getTime();
catch (ParseException e)
result = 0L;
return result;
然后在添加实体的时候这样添加:
Schema schema = new Schema(1,"com.sunzxyong.greendao5");
Entity item = schema.addEntity("Item");
item.addLongProperty("time").customType("java.lang.String","com.sunzxyong.greendaodemo.MyPropertyConverter");
new DaoGenerator().generateAll(schema, "../GreenDAODemo/app/src/main/java-gen");
其中customType()
方法的第一个参数为实体中的自定义类型的包名+类名,第二个参数为转换器的包名+类名。
点击运行生成实体后,我们打开Item类看看,发现time的类型为String类型:
public class Item
private String time;
public Item()
public Item(String time)
this.time = time;
public String getTime()
return time;
public void setTime(String time)
this.time = time;
我们再打开数据库文件看看time字段的类型:
发现为Integer类型,原因是我用第三方工具打开后,设计表中的类型没有Long类型,而就为Integer类型了
所以利用自定义属性转换器PropertyConverter我们只需要直接按实体中的类型添加数据,存入表中时候转换器会帮我们做好一系列转换工作。
以上是关于ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter的主要内容,如果未能解决你的问题,请参考以下文章
Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite