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的主要内容,如果未能解决你的问题,请参考以下文章

ORM对象关系映射之使用GreenDAO进行CRUD操作

GreenDao数据库框架

Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

Android笔记之greenDao3.0学习总结

[转]Android ORM系列之GreenDao最佳实践