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
복사

.png&blockId=22b7c3a6-5455-457c-9945-56a1bac0a558)
.png&blockId=22b7c3a6-5455-457c-9945-56a1bac0a558&width=256)