在使用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. 自定义Java注解的方式与应用

    注解的作用 Annotation(注解)是JDK 5.0引入的特性,它的基本作用就是修饰编程元素. 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记.编译器.开发工具或其他程序可以用反射 ...

  2. FLAnimatedImage -ios gif图片加载框架介绍

    简介 FLAnimatedImage 是 Flipboard 团队开发的在它们 App 中渲染 GIF 图片使用的库. 后来 Flipboard 将 FLAnimatedImage 开源出来供大家使用 ...

  3. python 列表解析与map和filter函数

    不知哪儿看到一个说法,大概是当map的函数参数可以直接引用一个已有的函数变量时(比如内建函数int,str之类的),用map更优美些,否则还是用列表解析更直观和快速. 我同意此说法. 昨天在写一个函数 ...

  4. FORM调用FORM(标准调客户化&客户化调标准)并执行查询的实现研究

    一.先来个比较简单的,标准FORM调用客户话FORM并执行查询 1.修改CUSTOM.PLL,使用 fnd_function.execute实现打开和传递参数 参考例子如下 PROCEDURE eve ...

  5. Android 网络图片加载之cude 框架

    偶然发现了这个框架,阿里图片加载用的这个框架.非常简单操作步骤. 1.首先下载软件包,直接搜Cube ImageLoader 这个. 2.加入jar文件 3.使用前的配置: public class ...

  6. [线程]Thead 中传参数RuntimeError: thread.__init__() not called

    在写一个多线程类的时候调用报错 RuntimeError: thread.__init__() not called class NotifyTread(threading.Thread): def ...

  7. 【Netty源码分析】Netty服务端bind端口过程

    这一篇博客我们介绍一下Netty服务端绑定端口的过程,我们通过跟踪代码一直到NIO原生绑定端口的操作. 绑定端口操作 ChannelFuture future = serverBootstrap.bi ...

  8. 关于tomcat中Servlet对象池

    Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...

  9. shell脚本实现冒泡排序

    手动输入一行字符串,并对其排序. 脚本如下: #!/bin/bash #a test about sort echo "please input a number list" re ...

  10. 【java集合框架源码剖析系列】java源码剖析之LinkedList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...