类型转换器

类型转换器使你可以在Model中使用默认未被支持的类型。你可以自定义属性值如何被写入到数据库,也可以自定义如何被从数据库中载入。

NOTETypeConverter只能支持普通的@Column,而不能有@PrimaryKey@ForeignKey等非限定性的数据。

一个类型转换器对所有数据库都是可用的。

如果我们指定的类型为一个Model,则在作为Column.FOREIGN_KEY时,可能会有一些不确定的行为。

作为示例,这里我们创建了一个LocationConverter,用于将Locations类型转换为String:

  // 第一个范型代表被保存到数据库的数据类型
  // 第二个范型表示Model中属性的类型
  @com.raizlabs.android.dbflow.annotation.TypeConverter
  public class LocationConverter extends TypeConverter<String,Location> {

    @Override
    public String getDBValue(Location model) {
        return model == null ? null : String.valueOf(model.getLatitude()) + "," + model.getLongitude();
    }

    @Override
    public Location getModelValue(String data) {
        String[] values = data.split(",");
        if(values.length < 2) {
            return null;
        } else {
            Location location = new Location("");
            location.setLatitude(Double.parseDouble(values[0]));
            location.setLongitude(Double.parseDouble(values[1]));
            return location;
        }
    }
  }

通过自定义LocationConverter转换器,现在我们可以在table中使用Location类型的属性了:

@Table(...)
public class SomeTable extends BaseModel {


  @Column
  Location location;

}

为列指定类型转换器

在3.0之后,列的类型转换器需要被显式指定:

@Table(...)
public class SomeTable extends BaseModel {


  @Column(typeConverter = SomeTypeConverter.class)
  Location location;

}

NOTE:enum枚举类型默认并不被支持。如果你需要使用,必须要自定义类型转换器。