Declare the model

It is possible to use a mixin to extend a custom model and give it database interaction methods. This way when querying the database no deserializing and type casts are needed: only model objects are used

Extend with DbModel

class Car with DbModel {
    String name;
    double price;

Override getters

class Car with DbModel {
    int id;

    Db get db => conf.db;

    DbTable get table => carTable;

conf.db is the Db object used. carTable is the car table schema

Declare a schema

final carTable = DbTable("car")
   ..boolean("is_4wd", defaultValue: false);

Include this schema in your database initialization call:

db.init(path: "db.sqlite", schema: <DbTable>[carTable]);

Define serializers

The toDb serializer and fromDb deserializer must be defined

class Car with DbModel {
  Map<String, dynamic> toDb() {
    final row = <String, dynamic>{
      "name": name,
      "max_speed": maxSpeed,
      "price": price,
      "year": year.millisecondsSinceEpoch,
      "is_4wd": is4wd,
    return row;

  Car fromDb(Map<String, dynamic> map) {
    final car = Car(
    id: map["id"] as int,
    name: map["name"].toString(),
    maxSpeed: map["max_speed"] as int,
    price: map["price"] as double,
    year: DateTime.fromMillisecondsSinceEpoch(map["year"] as int),
    is4wd: (map["is_4wd"].toString() == "true"),
  return car;