类型转换器
类型转换器使你可以在Model
中使用默认未被支持的类型。你可以自定义属性值如何被写入到数据库,也可以自定义如何被从数据库中载入。
NOTE:TypeConverter
只能支持普通的@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
枚举类型默认并不被支持。如果你需要使用,必须要自定义类型转换器。