From 4862ae66b2b65452348b94ad92805ee4d44def36 Mon Sep 17 00:00:00 2001 From: Dmytro Puzak Date: Tue, 28 Jun 2022 18:54:38 +0300 Subject: [PATCH] Added TypeConverters sample. --- example/lib/database.dart | 2 ++ example/lib/database.g.dart | 44 +++++++++++++++++++++++---------- example/lib/main.dart | 13 ++++------ example/lib/task.dart | 11 ++++++--- example/lib/type_converter.dart | 13 ++++++++++ 5 files changed, 58 insertions(+), 25 deletions(-) create mode 100644 example/lib/type_converter.dart diff --git a/example/lib/database.dart b/example/lib/database.dart index 396a7143..f0d78a3f 100644 --- a/example/lib/database.dart +++ b/example/lib/database.dart @@ -2,12 +2,14 @@ import 'dart:async'; import 'package:example/task.dart'; import 'package:example/task_dao.dart'; +import 'package:example/type_converter.dart'; import 'package:floor/floor.dart'; import 'package:sqflite/sqflite.dart' as sqflite; part 'database.g.dart'; @Database(version: 1, entities: [Task]) +@TypeConverters([DateTimeConverter]) abstract class FlutterDatabase extends FloorDatabase { TaskDao get taskDao; } diff --git a/example/lib/database.g.dart b/example/lib/database.g.dart index 5d6d96ac..2635d580 100644 --- a/example/lib/database.g.dart +++ b/example/lib/database.g.dart @@ -82,7 +82,7 @@ class _$FlutterDatabase extends FlutterDatabase { }, onCreate: (database, version) async { await database.execute( - 'CREATE TABLE IF NOT EXISTS `Task` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message` TEXT NOT NULL)'); + 'CREATE TABLE IF NOT EXISTS `Task` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL)'); await callback?.onCreate?.call(database, version); }, @@ -102,22 +102,31 @@ class _$TaskDao extends TaskDao { _taskInsertionAdapter = InsertionAdapter( database, 'Task', - (Task item) => - {'id': item.id, 'message': item.message}, + (Task item) => { + 'id': item.id, + 'message': item.message, + 'timestamp': _dateTimeConverter.encode(item.timestamp) + }, changeListener), _taskUpdateAdapter = UpdateAdapter( database, 'Task', ['id'], - (Task item) => - {'id': item.id, 'message': item.message}, + (Task item) => { + 'id': item.id, + 'message': item.message, + 'timestamp': _dateTimeConverter.encode(item.timestamp) + }, changeListener), _taskDeletionAdapter = DeletionAdapter( database, 'Task', ['id'], - (Task item) => - {'id': item.id, 'message': item.message}, + (Task item) => { + 'id': item.id, + 'message': item.message, + 'timestamp': _dateTimeConverter.encode(item.timestamp) + }, changeListener); final sqflite.DatabaseExecutor database; @@ -135,23 +144,29 @@ class _$TaskDao extends TaskDao { @override Future findTaskById(int id) async { return _queryAdapter.query('SELECT * FROM task WHERE id = ?1', - mapper: (Map row) => - Task(row['id'] as int?, row['message'] as String), + mapper: (Map row) => Task( + row['id'] as int?, + row['message'] as String, + _dateTimeConverter.decode(row['timestamp'] as int)), arguments: [id]); } @override Future> findAllTasks() async { return _queryAdapter.queryList('SELECT * FROM task', - mapper: (Map row) => - Task(row['id'] as int?, row['message'] as String)); + mapper: (Map row) => Task( + row['id'] as int?, + row['message'] as String, + _dateTimeConverter.decode(row['timestamp'] as int))); } @override Stream> findAllTasksAsStream() { return _queryAdapter.queryListStream('SELECT * FROM task', - mapper: (Map row) => - Task(row['id'] as int?, row['message'] as String), + mapper: (Map row) => Task( + row['id'] as int?, + row['message'] as String, + _dateTimeConverter.decode(row['timestamp'] as int)), queryableName: 'Task', isView: false); } @@ -186,3 +201,6 @@ class _$TaskDao extends TaskDao { await _taskDeletionAdapter.deleteList(tasks); } } + +// ignore_for_file: unused_element +final _dateTimeConverter = DateTimeConverter(); diff --git a/example/lib/main.dart b/example/lib/main.dart index dcb0793c..dc3ccaf9 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -107,12 +107,9 @@ class TaskListCell extends StatelessWidget { key: Key('${task.hashCode}'), background: Container(color: Colors.red), direction: DismissDirection.endToStart, - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 8, - horizontal: 16, - ), - child: Text(task.message), + child: ListTile( + leading: Text(task.message), + trailing: Text(task.timestamp.toIso8601String()), ), onDismissed: (_) async { await dao.deleteTask(task); @@ -134,7 +131,7 @@ class TasksTextField extends StatelessWidget { TasksTextField({ Key? key, required this.dao, - }) : _textEditingController = TextEditingController(), + }) : _textEditingController = TextEditingController(), super(key: key); @override @@ -177,7 +174,7 @@ class TasksTextField extends StatelessWidget { if (message.trim().isEmpty) { _textEditingController.clear(); } else { - final task = Task(null, message); + final task = Task(null, message, DateTime.now()); await dao.insertTask(task); _textEditingController.clear(); } diff --git a/example/lib/task.dart b/example/lib/task.dart index b570c8f9..e353f750 100644 --- a/example/lib/task.dart +++ b/example/lib/task.dart @@ -7,7 +7,9 @@ class Task { final String message; - Task(this.id, this.message); + final DateTime timestamp; + + Task(this.id, this.message, this.timestamp); @override bool operator ==(Object other) => @@ -15,13 +17,14 @@ class Task { other is Task && runtimeType == other.runtimeType && id == other.id && - message == other.message; + message == other.message && + timestamp == other.timestamp; @override - int get hashCode => id.hashCode ^ message.hashCode; + int get hashCode => id.hashCode ^ message.hashCode ^ timestamp.hashCode; @override String toString() { - return 'Task{id: $id, message: $message}'; + return 'Task{id: $id, message: $message, timestamp: $timestamp}'; } } diff --git a/example/lib/type_converter.dart b/example/lib/type_converter.dart new file mode 100644 index 00000000..e66e614a --- /dev/null +++ b/example/lib/type_converter.dart @@ -0,0 +1,13 @@ +import 'package:floor/floor.dart'; + +class DateTimeConverter extends TypeConverter { + @override + DateTime decode(int databaseValue) { + return DateTime.fromMillisecondsSinceEpoch(databaseValue); + } + + @override + int encode(DateTime value) { + return value.millisecondsSinceEpoch; + } +}