When building out Model classes, you may wish to provide a different type of @Column that from the standard supported column types. To recap the standard column types include:
  1. 1.
    String, char, Character
  2. 2.
    All numbers types (primitive + boxed)
  3. 3.
  4. 4.
    Blob (DBFlow's version)
  5. 5.
  6. 6.
  7. 7.
    Model as @ForeignKey or @ColumnMap
  8. 8.
  9. 9.
  10. 10.
TypeConverter do not support:
  1. 1.
    Any Parameterized fields.
  2. 2.
    List<T>, Map<T>, etc. Best way to fix this is to create a separate table relationship
  3. 3.
    Conversion from one type-converter to another (i.e JSONObject to Date). The first parameter of TypeConverter is the value of the type as if it was a primitive/boxed type.
  4. 4.
    Conversion from custom type to Model, or Model to a supported type.
  5. 5.
    The custom class must map to a non-complex field such as String, numbers, char/Character or Blob

Define a TypeConverter

Defining a TypeConverter is quick and easy.
This example creates a TypeConverter for a field that is JSONObject and converts it to a String representation:
class JSONConverter : TypeConverter<String, JSONObject>() {
override fun getDBValue(model: JSONObject?): String? = model?.toString()
override fun getModelValue(data: String?): JSONObject? =
try {
} catch (JSONException e) {
// you should consider logging or throwing exception.
Once this is defined, by using the annotation @TypeConverter, it is registered automatically across all databases.
There are cases where you wish to provide multiple TypeConverter for same kind of field (i.e. Date with different date formats stored in a DB). You can override a field's TypeConverter locally at the @Column level.

TypeConverter for specific @Column

In DBFlow, specifying a TypeConverter for a @Column is as easy as @Column(typeConverter = JSONConverter::class). What it will do is create the converter once for use only when that column is used.