在使用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的更多相关文章

  1. ORM对象关系映射之GreenDAO源码解析

    上一篇我们学习了GreenDAO的CRUD基本操作,可以说是非常的方便的,而且GreenDAO的效率和性能远远高于其它两款流行的ORM框架,下面是我从官网找的一副它们三个ORM框架之间的性能测试的直观 ...

  2. ORM对象关系映射之GreenDAO建立多表关联

    利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张 ...

  3. Android ORM对象关系映射之GreenDAO建立多表关联

    https://blog.csdn.net/u010687392/article/details/48496299 利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数 ...

  4. ORM对象关系映射之GreenDAO高级用法

    CRUD 增加: dao.insert(Student entity);//添加一个 dao.insertInTx(Student... entity);//批量添加 删除: dao.deleteBy ...

  5. ORM 对象关系映射

    ORM (object relation mapping) 就是将对象数据转换为sql语句并执行 对象关系映射框架 orm 需要做的事情 1 生成创建表的语句 2 插入数据的语句 3 删除数据的语句 ...

  6. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  7. Php ORM 对象关系映射

    ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将 ...

  8. $Django setting.py配置 ,GET、POST深入理解,三件套,orm对象关系映射简介

    1 django中app的概念: 大学:----------------- 项目  信息学院 ----------app01  物理学院-----------app02 ****强调***:创建的每一 ...

  9. ORM对象关系映射

    ORM 总结: ORM:对象关系映射 作用: 1.将定义数据库模型类--> 数据库表 2.将定义数据库模型类中的属性--->数据库表字段 3.将模型对象的操作(add,delete,com ...

随机推荐

  1. ajax中xmlhttp.readyState和xmlhttp.status的值及解释

    xmlhttp.readyState的值及解释: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...

  2. 计算机网络之远程终端协议TELNET

    TELNET 是一个简单的远程终端协议.用户用 TELNET 就可在其所在地通过 TCP 连接注册(即登录)到远地的另一个主机上(使用主机名或 IP 地址). TELNET 能将用户的击键传到远地主机 ...

  3. 操作系统服务:OS模块

    http://blog.csdn.net/pipisorry/article/details/52454486 一般的操作系统服务之OS模块Generic Operating System Servi ...

  4. 3.0、Android Studio构建和运行应用

    默认情况下,Android Studio可以通过简单的点击就会将新的项目部署到虚拟机或者物理设备中.在Instant Run的帮助下,你可以将更改的方法或资源文件直接推送到一个运行的app而无需构建一 ...

  5. Servlet之文件上传

    上传表单中的注意事项: 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法 表单 enctype 属性应该设置为multipart/form-data 下面的实例是借助于com ...

  6. c语言求最大公约数

    求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...

  7. matlab中的sub2ind函数

    在matlab中,矩阵的存储是按列优先,sub2ind函数将矩阵中指定元素的行列下标转换成存储的序号,即线性索引号.下面,我们举例子进行说明. 1 建立一个3*4*2的矩阵 rng(0,'twiste ...

  8. Linux内核2.6的进程调度

         Linux是多任务抢占操作系统,多任务就是指多个进程间通过分时切换来并发执行.非抢占的系统是对每个进程而言,除非时间片用完或主动放弃否则不会被剥夺CPU,主动放弃包括调用一些调度的系统调用( ...

  9. J2EE学习从菜鸟变大鸟之九 深入浅出理解 Servlet-----实例解析

    关于Servlet的基础内容在前面已经和大家分享过了,参考J2EE学习从菜鸟变大鸟之七 Servlet,现在结合到DRP中学习,深刻的体会Servlet起到了枢纽中转的作用,控制逻辑(到MVC中更像是 ...

  10. vbox centos安装增强工具

    就是虚拟机识别不了宿主机的usb接口,这个虚拟机有没有图形界面,看看怎么装. 一个是依赖包问题,另一个就是挂了安装包,但是我怎么找到它并安装上去的问题. 虚拟机是centos6.6哈 vbox4.3. ...