Table of Contents
Drift database :
Drift database is a reactive library used to store data locally built on top of sqlite database in your mobile apps.
pubspec.yaml :
Add the required libraries for the drift.
dependencies: drift: ^1.7.1 sqlite3_flutter_libs: ^0.5.0 path_provider: ^2.0.0 path: ^1.8.0
dev_dependencies: drift_dev: ^1.7.0 build_runner: ^2.1.11
data.dart :
import 'package:drift/drift.dart'; part 'data.g.dart'; class Products extends Table IntColumn get id => integer().autoIncrement()(); TextColumn get title => text()(); TextColumn get description => text()(); abstract class ProductsView extends View Products get products; @override Query as() => select([ products.title ]).from(products); @DriftDatabase(tables:[ Products ], views:[ ProductsView ]) class Database extends _$Database Database(QueryExecutor e): super(e); @override int get schemaVersion => 2;
data.g.dart :
This is the generated file for data.dart file.
// GENERATED CODE - DO NOT MODIFY BY HAND part of 'data.dart'; // ************************************************************************** // MoorGenerator // ************************************************************************** // ignore_for_file: type=lint class Product extends DataClass implements Insertable<Product> final int id; final String title; final String description; Product(required this.id, required this.title, required this.description); factory Product.fromData(Map<String, dynamic> data, String? prefix) final effectivePrefix = prefix ?? ''; return Product( id: const IntType() .mapFromDatabaseResponse(data['$effectivePrefixid'])!, title: const StringType() .mapFromDatabaseResponse(data['$effectivePrefixtitle'])!, description: const StringType() .mapFromDatabaseResponse(data['$effectivePrefixdescription'])!, ); @override Map<String, Expression> toColumns(bool nullToAbsent) final map = <String, Expression>; map['id'] = Variable<int>(id); map['title'] = Variable<String>(title); map['description'] = Variable<String>(description); return map; ProductsCompanion toCompanion(bool nullToAbsent) return ProductsCompanion( id: Value(id), title: Value(title), description: Value(description), ); factory Product.fromJson(Map<String, dynamic> json, ValueSerializer? serializer) serializer ??= driftRuntimeOptions.defaultSerializer; return Product( id: serializer.fromJson<int>(json['id']), title: serializer.fromJson<String>(json['title']), description: serializer.fromJson<String>(json['description']), ); @override Map<String, dynamic> toJson(ValueSerializer? serializer) serializer ??= driftRuntimeOptions.defaultSerializer; return <String, dynamic> 'id': serializer.toJson<int>(id), 'title': serializer.toJson<String>(title), 'description': serializer.toJson<String>(description), ; Product copyWith(int? id, String? title, String? description) => Product( id: id ?? this.id, title: title ?? this.title, description: description ?? this.description, ); @override String toString() return (StringBuffer('Product(') ..write('id: $id, ') ..write('title: $title, ') ..write('description: $description') ..write(')')) .toString(); @override int get hashCode => Object.hash(id, title, description); @override bool operator ==(Object other) => identical(this, other) class ProductsCompanion extends UpdateCompanion<Product> final Value<int> id; final Value<String> title; final Value<String> description; const ProductsCompanion( this.id = const Value.absent(), this.title = const Value.absent(), this.description = const Value.absent(), ); ProductsCompanion.insert( this.id = const Value.absent(), required String title, required String description, ) : title = Value(title), description = Value(description); static Insertable<Product> custom( Expression<int>? id, Expression<String>? title, Expression<String>? description, ) return RawValuesInsertable( if (id != null) 'id': id, if (title != null) 'title': title, if (description != null) 'description': description, ); ProductsCompanion copyWith( Value<int>? id, Value<String>? title, Value<String>? description) return ProductsCompanion( id: id ?? this.id, title: title ?? this.title, description: description ?? this.description, ); @override Map<String, Expression> toColumns(bool nullToAbsent) final map = <String, Expression>; if (id.present) map['id'] = Variable<int>(id.value); if (title.present) map['title'] = Variable<String>(title.value); if (description.present) map['description'] = Variable<String>(description.value); return map; @override String toString() return (StringBuffer('ProductsCompanion(') ..write('id: $id, ') ..write('title: $title, ') ..write('description: $description') ..write(')')) .toString(); class $ProductsTable extends Products with TableInfo<$ProductsTable, Product> @override final GeneratedDatabase attachedDatabase; final String? _alias; $ProductsTable(this.attachedDatabase, [this._alias]); final VerificationMeta _idMeta = const VerificationMeta('id'); @override late final GeneratedColumn<int?> id = GeneratedColumn<int?>( 'id', aliasedName, false, type: const IntType(), requiredDuringInsert: false, defaultConstraints: 'PRIMARY KEY AUTOINCREMENT'); final VerificationMeta _titleMeta = const VerificationMeta('title'); @override late final GeneratedColumn<String?> title = GeneratedColumn<String?>( 'title', aliasedName, false, type: const StringType(), requiredDuringInsert: true); final VerificationMeta _descriptionMeta = const VerificationMeta('description'); @override late final GeneratedColumn<String?> description = GeneratedColumn<String?>( 'description', aliasedName, false, type: const StringType(), requiredDuringInsert: true); @override List<GeneratedColumn> get $columns => [id, title, description]; @override String get aliasedName => _alias ?? 'products'; @override String get actualTableName => 'products'; @override VerificationContext validateIntegrity(Insertable<Product> instance, bool isInserting = false) final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('id')) context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); if (data.containsKey('title')) context.handle( _titleMeta, title.isAcceptableOrUnknown(data['title']!, _titleMeta)); else if (isInserting) context.missing(_titleMeta); if (data.containsKey('description')) context.handle( _descriptionMeta, description.isAcceptableOrUnknown( data['description']!, _descriptionMeta)); else if (isInserting) context.missing(_descriptionMeta); return context; @override Set<GeneratedColumn> get $primaryKey => id; @override Product map(Map<String, dynamic> data, String? tablePrefix) return Product.fromData(data, prefix: tablePrefix != null ? '$tablePrefix.' : null); @override $ProductsTable createAlias(String alias) return $ProductsTable(attachedDatabase, alias); class ProductsViewData extends DataClass (other is ProductsViewData && other.title == this.title); class $ProductsViewView extends ViewInfo<$ProductsViewView, ProductsViewData> implements HasResultSet final String? _alias; @override final _$Database attachedDatabase; $ProductsViewView(this.attachedDatabase, [this._alias]); $ProductsTable get products => attachedDatabase.products.createAlias('t0'); @override List<GeneratedColumn> get $columns => [products.title]; @override String get aliasedName => _alias ?? entityName; @override String get entityName => 'products_view'; @override String? get createViewStmt => null; @override $ProductsViewView get asDslTable => this; @override ProductsViewData map(Map<String, dynamic> data, String? tablePrefix) return ProductsViewData.fromData(data, prefix: tablePrefix != null ? '$tablePrefix.' : null); late final GeneratedColumn<String?> title = GeneratedColumn<String?>( 'title', aliasedName, false, type: const StringType()); @override $ProductsViewView createAlias(String alias) return $ProductsViewView(attachedDatabase, alias); @override Query? get query => (attachedDatabase.selectOnly(products, includeJoinedTableColumns: false) ..addColumns($columns)); @override Set<String> get readTables => const 'products'; abstract class _$Database extends GeneratedDatabase _$Database(QueryExecutor e) : super(SqlTypeSystem.defaultInstance, e); late final $ProductsTable products = $ProductsTable(this); late final $ProductsViewView productsView = $ProductsViewView(this); @override Iterable<TableInfo> get allTables => allSchemaEntities.whereType<TableInfo>(); @override List<DatabaseSchemaEntity> get allSchemaEntities => [products, productsView];
main.dart :
Providing the full code for implementation for drift database.
import 'package:drift/native.dart'; import 'data.dart'; Future<void> main() async final db = Database(NativeDatabase.memory()); await db.into(db.products).insert(ProductsCompanion.insert(title: "flutter drift", description: "Drift database")); await db.into(db.products).insert(ProductsCompanion.insert(title: "tutorial on drift", description: "Drift database")); (await db.select(db.products).get()).forEach(print);
output :
More Stories
Natural Tactics to Overcome Depression Without Medication
Celebrating Milestones Forward Can Yield Amazing Results
Radar Trends to Watch: July 2022 – O’Reilly