Search

drift

1.
add pubspec.yaml
a.
path_provider: ^2.0.0
b.
drift
c.
sqlite3_flutter_libs: ^0.5.0
d.
drift_dev: ^2.6.0
e.
build_runner: ^2.3.3
2.
add Table Class
// model/class_name.dart import 'package:drift/drift.dart'; class ClassNames extends Table { // PRIMARY KEY IntColumn get id => integer().autoIncrement()(); // Content TextColumn get content => text()(); // Date DateTimeColumn get date => dateTime()(); // Start Time IntColumn get startTime => integer()(); // End Time IntColumn get endTime => integer()(); // Category Color Table ID IntColumn get colorId => integer()(); // Created (Default DateTime.now()) DateTimeColumn get createdAt => dateTime().clientDefault( () => DateTime.now(), )(); }
Dart
복사
3.
add drift main layout
// database/drift_database.dart // drift main layout import 'dart:io'; // DB location package import 'package:drift/drift.dart'; import 'package:drift/native.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; // models modify import '../model/goal.dart'; import '../model/mood.dart'; import '../model/todo_item.dart'; part 'drift_database.g.dart'; // error for now ( tables: [ Goals, // modify Moods, // modify Todos, // modify ], ) class LocalDatabase extends _$LocalDatabase{ LocalDatabase() : super(_openConnection()); } // set DB location LazyDatabase _openConnection(){ return LazyDatabase(()async{ final dbFolder = await getApplicationDocumentsDirectory(); // bring application directory assigned by OS final file = File(p.join(dbFolder.path, 'db.sqlite')); // Import library 'dart.io'. // set file name as db.sqlite return NativeDatabase(file); }); }
Dart
복사
4.
on Terminal tab, run flutter pub run build_runner build
5.
add @override under LocalDatabase
// drift main layout class LocalDatabase extends _$LocalDatabase{ LocalDatabase() : super(_openConnection()); int get schemaVersion => 1; // manage schema version }
Dart
복사
6.
add Create query under LocalDatabase
// Future<int> recieves Primary Key value // parameter as Model/Table/Class Companion (i.e. SchedulesCompanion, CategoryColorCompanion) Future<int> createClassName(ClassNamesCompanion data) => into(classNames).insert(data); // Model/Table/Class in lowercase on first letter
Dart
복사
7.
add Select query under LocalDatabase
// Recieve List of ClassName Future<List<ClassName>> getClassNames() => select(classNames).get(); // Recieve ClassName by Id Future<ClassName> getClassNameById(int id) => (select(classNames)..where((tbl) => tbl.id.equals(id))).getSingle(); // Unrestricted Stream<List<ClassName>> watchClassNames() => select(classnames).watch(); // Restricted 1 Stream<List<ClassName>> watchClassNames(DateTime date) { return (select(classnames)..where((tbl)=> tbl.date.equals(date))).watch(); } // Restricted 2 Stream<List<ClassName>> watchClassNames(DateTime date) { final query = select(classNames); query.where((tbl) => tbl.date.equals(date)); return query.watch() } // Join & Order see No.8 Stream<List<ClassName1WithClassName2>> watchClassNames(DateTime date) { final query = select(classNames1).join([ innerJoin(classNames2, classNames2.id.equalsExp(classNames1.columnName)) // columnName is FK column name ]); // change query query.where(classNames1.date.eqauls(date)); // order by query.orderBy( [ OderingTerm.asc(classNames!.startingTime), ] ); // rows = all data, row = each data return query.watch().map( (rows) => rows.map( (row) => ClassName1WithClassName2( className1: row.readTable(classNames1), className2: row.readTable(classNames2), ), ).toList(), ); } // order Stream<List<ClassName>> getClassNames() => (select(classNames)..orderBy([(t) => OrderingTerm.desc(t.columnId)])).watch();
Dart
복사
8.
For Join
// model/table1_with_table2.dart import '../database/drift_database'; class ClassName1WithClassName2 { final ClassName1 className1; final ClassName2 className2; Class1WithClass2({ required this.className1, required this.className2, }); }
Dart
복사
9.
add Remove query under LocalDatabase
// remove all removeAllClassName() => delete(classNames).go(); // remove by Id removeClassNameById(int id) => (delete(classNames)..where((tbl) => tbl.id.equals(id))).go();
Dart
복사
10.
add Update query under LocalDatabase
Future<int> updateClassNameById(int id, ClassNamesCompanion data) => (update(classNames)..where((tbl) => tbl.id.equals(id))).write(data);
Dart
복사
11.
add final database = LocalDatabase();
// main.dart import 'package:flutter/material.dart'; void main() async { final database = LocalDatabase(); runApp( MaterialApp( home: HomeScreen(), ); ), }
Dart
복사
12.
add get_it
// main.dart import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; // add get_it package void main() async { final database = LocalDatabase(); // Dependency Injection GetIt.I.registerSingleton<LocalDatabase>(database); runApp( MaterialApp( home: HomeScreen(), ); ), }
Dart
복사
13.
When use
// when use import 'package:get_it/get_it.dart'; import 'package:project_name/database/drift_database.dart'; int? selectedId; FutureBuilder<List<ClassName>>( future: GetIt.I<LocalDatabase>().getClassNames(), builder: (context, snapshot) { // passing Primary Key if (snapshot.hasData && selectedId == null && snapshot.data!.isNotEmpty){ selectedId = snapshot.data![0].PKColumnName; } // pass list of items return CustomWidget( objects: snapshot.hasData ? snapshot.data! : [], list: snapshot.hasData ? snapshot.data!.map((e) => e.columnName).toList() : [], selectedId: selectedId, } ) StreamBuilder<List<ClassName>>( stream: GetIt.I<LocalDatabase>().watchClassNames(), builder: (context, snapshot) { // waiting for data if(!snapshot.hasData){ return Center( child:CircularProgressIndicator() ); } // recieved data with null value if(snapshot.hasData && snapshot.data!.isEmpty){ return Center( child: Text("There's no item"),. ); } return ListView.separated( itemCount: snapshot.data!.length, // widget between each items separatorBuilder: (context, index) { return SizedBox( height: 8.0, ); }, // widget item to build itemBuilder: (context, index) { final itemName = snapshot.data![index]; return ScheduleCard( startTime: itemName.data.startTime, endTime: itemName.endTime, content: itemName.content, color: Colors.red, ); }, ); }, ), // selectId == e.id // when error import 'package:drift/drift.dart' show Value; await GetIt.I<LocalDatabase>().queryName(), // create query on main.dart await database.createClassNames( {ClassNamesCompanion}( // must wrap value with Value columnName: Value(value), columnName: Value(value), ) ) // get query await database.getClassNames()
Dart
복사
/typedef asdf = void Function(int val) getDbData .map( (e) => GestureDetector( onTap: () { colorIdSetter(e.id); }, )
Dart
복사
// onSaved void onSavePressed() { // check if formKey is created but not implemented if (formKey.currentState == null) { return; } // run after validator if (formKey.currentState!.validate()) { // run all validator under same formKey // No Error formKey.currentState!.save(); // save Form (initiate all onSaved methods) GetIt.I<LocalDatabase>().createSchedul( await SchedulesCompanion( content: date: starttime: endTime: colorId: ), ); Navigator.of(context).pop(); } else { // Error } }
Dart
복사

Example

// model/schedule.dart import 'package:drift/drift.dart'; class Schedules extends Table { // PRIMARY KEY IntColumn get id => integer().autoIncrement()(); // Content TextColumn get content => text()(); // Date DateTimeColumn get date => dateTime()(); // Start Time IntColumn get startTime => integer()(); // End Time IntColumn get endTime => integer()(); // Category Color Table ID IntColumn get colorId => integer()(); // Created (Default DateTime.now()) DateTimeColumn get createdAt => dateTime().clientDefault( () => DateTime.now(), )(); } // model/category_color.dart import 'package:drift/drift.dart'; class CategoryColors extends Table { // PRIMARY KEY IntColumn get id => integer().autoIncrement()(); // Color TextColumn get hexCode => text()();
Dart
복사
// database/drift_database.dart // db file path import 'dart:io'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; // db library import 'package:drift/drift.dart'; import 'package:drift/native.dart'; import 'package:calendar_test/model/category_color.dart'; import 'package:calendar_test/model/schedule.dart'; // import including private data // {current_filename}.g.dart part 'drift_database.g.dart'; // import tables generated ( tables: [ Schedules, CategoryColors, ] ) // _$LocalDatabase will be generated inside 'drift.database.g.dart' // LocalDatabase is the name of the DB class LocalDatabase extends _$LocalDatabase { LocalDatabase() : super(_openConnection()); /// Create // must use Companion // can receive ID (Primary Key) using Future // function to create Schedule Future<int> createSchedule(SchedulesCompanion data) => // schedules is stated in _$LocalDatabase into(schedules).insert(data); Future<int> createCategoryColor(CategoryColorsCompanion data) => into(categoryColors).insert(data); /// Read // Can receive data as Stream or Future Future<List<CategoryColor>> getCategoryColors() => select(categoryColors).get(); // after terminal run // must manage version of the schema int get schemaVersion => 1; } LazyDatabase _openConnection() { return LazyDatabase(() async { // get folder that this application has access to final dbFolder = await getApplicationDocumentsDirectory(); // import dart.io not dart.html // save file to db.sqlite final file = File(p.join(dbFolder.path, 'db.sqlite')); return NativeDatabase(file); }); }
Dart
복사
// renderColor(Colors.red), 0xfff44336 // renderColor(Colors.orange), 0xffff9800 // renderColor(Colors.green), 0xff4caf50 // renderColor(Colors.cyan), 0xff00bcd4 // renderColor(Colors.indigoAccent), 0xff536dfe // renderColor(Colors.pink), 0xffe91e63
Dart
복사