类型转换器

类型转换使Model内字段不一定是数据库类型的。它们把该字段的值转换成在数据库可以定义的类型。它们还定义了当一个模型被加载的方式,我们使用转换器重新创建字段。注意TypeConverter只能转化成常规列,由于数据中的非确定性映射,PrimaryKeyForeignKey是不能转化的。

这些转换器在所有数据库共享。

如果我们指定model值作为Model 类的话,可能有一些字段非常意外的行为被定义为Column.FOREIGN_KEY

下面是实现LocationConverter,把位置转化成字符串:

  1. // First type param is the type that goes into the database
  2. // Second type param is the type that the model contains for that field.
  3. @com.raizlabs.android.dbflow.annotation.TypeConverter
  4. public class LocationConverter extends TypeConverter<String,Location> {
  5. @Override
  6. public String getDBValue(Location model) {
  7. return model == null ? null : String.valueOf(model.getLatitude()) + "," + model.getLongitude();
  8. }
  9. @Override
  10. public Location getModelValue(String data) {
  11. String[] values = data.split(",");
  12. if(values.length < 2) {
  13. return null;
  14. } else {
  15. Location location = new Location("");
  16. location.setLatitude(Double.parseDouble(values[0]));
  17. location.setLongitude(Double.parseDouble(values[1]));
  18. return location;
  19. }
  20. }
  21. }

要使用LocationConverter,使用类型转换器,我们只需添加类作为我们的表中的字段:

  1. @Table(...)
  2. public class SomeTable extends BaseModel {
  3. @Column
  4. Location location;
  5. }

列具体的类型转换器

作为3.0的TypeConverter可以在column-by-column基础上使用。

  1. @Table(...)
  2. public class SomeTable extends BaseModel {
  3. @Column(typeConverter = SomeTypeConverter.class)
  4. Location location;
  5. }

: enum 类举希望从默认枚举转换(从枚举到字符串),你必须定义一个自定义类型转换为列。