2024-05-19 22:08:04 +02:00
|
|
|
import 'dart:convert';
|
2024-05-28 21:59:44 +02:00
|
|
|
import 'package:cpd/database/todo_interface.dart';
|
2024-05-19 22:08:04 +02:00
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
2024-05-12 00:08:54 +02:00
|
|
|
import 'package:sqflite/sqflite.dart';
|
|
|
|
import 'package:cpd/database/db.dart';
|
|
|
|
import 'package:cpd/database/habit.dart';
|
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
class TodoDB implements ToDoInterface {
|
2024-05-12 00:08:54 +02:00
|
|
|
final tableName = 'todos';
|
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
@override
|
2024-05-12 00:08:54 +02:00
|
|
|
Future<void> createTable(Database database) async {
|
2024-05-28 21:59:44 +02:00
|
|
|
try {
|
|
|
|
await database.execute("""CREATE TABLE IF NOT EXISTS $tableName (
|
2024-05-12 00:08:54 +02:00
|
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
isComplete INTEGER NOT NULL,
|
|
|
|
title TEXT NOT NULL,
|
2024-05-19 22:08:04 +02:00
|
|
|
subtitle TEXT,
|
|
|
|
icon TEXT
|
2024-05-12 00:08:54 +02:00
|
|
|
)""");
|
2024-05-28 21:59:44 +02:00
|
|
|
}
|
|
|
|
catch(e) {
|
|
|
|
print("Error creating a table: ¢e");
|
|
|
|
}
|
2024-05-12 00:08:54 +02:00
|
|
|
}
|
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
@override
|
2024-05-24 00:01:08 +02:00
|
|
|
Future<int> create({required String title, required String subtitle, required IconData icon}) async {
|
2024-05-28 21:59:44 +02:00
|
|
|
try {
|
|
|
|
final database = await HabitDatabase().database;
|
|
|
|
return await database.rawInsert(
|
|
|
|
'''insert into $tableName (isComplete, title, subtitle, icon)
|
2024-05-19 22:08:04 +02:00
|
|
|
values (?,?,?,?)''',
|
2024-05-28 21:59:44 +02:00
|
|
|
[0 ,title, subtitle, _iconDataToString(icon)],
|
|
|
|
);
|
2024-05-24 00:01:08 +02:00
|
|
|
}
|
2024-05-28 21:59:44 +02:00
|
|
|
catch (e) {
|
|
|
|
print('Error creating habit: $e');
|
|
|
|
return Future.error(e);
|
2024-05-24 00:01:08 +02:00
|
|
|
}
|
2024-05-19 22:08:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
IconData _stringToIconData(String iconString) {
|
|
|
|
final decoded = jsonDecode(iconString);
|
|
|
|
return IconData(
|
|
|
|
decoded['codePoint'],
|
|
|
|
fontFamily: decoded['fontFamily'],
|
|
|
|
fontPackage: decoded['fontPackage'],
|
|
|
|
matchTextDirection: decoded['matchTextDirection'],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
String _iconDataToString(IconData icon) {
|
|
|
|
return jsonEncode({
|
|
|
|
'codePoint': icon.codePoint,
|
|
|
|
'fontFamily': icon.fontFamily,
|
|
|
|
'fontPackage': icon.fontPackage,
|
|
|
|
'matchTextDirection': icon.matchTextDirection,
|
|
|
|
});
|
2024-05-12 00:08:54 +02:00
|
|
|
}
|
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
@override
|
2024-05-24 00:01:08 +02:00
|
|
|
Future<List<Habit>> fetchAll() async {
|
2024-05-28 21:59:44 +02:00
|
|
|
try {
|
|
|
|
final database = await HabitDatabase().database;
|
|
|
|
final todos = await database.query(tableName);
|
|
|
|
return todos.map((todo) {
|
|
|
|
final habit = Habit.fromSqfliteDatabase(todo);
|
|
|
|
habit.icon = _stringToIconData(todo['icon'] as String);
|
|
|
|
return habit;
|
|
|
|
}).toList();
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
print('Error fetching habits: $e');
|
|
|
|
return Future.error(e);
|
|
|
|
}
|
2024-05-12 00:08:54 +02:00
|
|
|
}
|
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
@override
|
2024-05-19 22:08:04 +02:00
|
|
|
Future<Habit?> fetchById(int id) async {
|
2024-05-28 21:59:44 +02:00
|
|
|
try {
|
|
|
|
final database = await HabitDatabase().database;
|
|
|
|
final todo = await database.query(tableName, where: 'id = ?', whereArgs: [id]);
|
|
|
|
if (todo.isNotEmpty) { // Überprüfen, ob todo nicht null ist und nicht leer ist
|
|
|
|
final habit = Habit.fromSqfliteDatabase(todo.first);
|
|
|
|
habit.icon = _stringToIconData(todo.first['icon'] as String);
|
|
|
|
return habit;
|
|
|
|
} else {
|
|
|
|
return null; // Wenn kein Eintrag gefunden wurde, geben Sie null zurück
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
print('Error fetching habit by ID: $e');
|
|
|
|
return Future.error(e);
|
2024-05-19 22:08:04 +02:00
|
|
|
}
|
2024-05-12 00:08:54 +02:00
|
|
|
}
|
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
@override
|
2024-05-24 00:01:08 +02:00
|
|
|
Future<int> update({required int id, required String title, required String subtitle, required IconData icon}) async {
|
2024-05-28 21:59:44 +02:00
|
|
|
try {
|
|
|
|
final database = await HabitDatabase().database;
|
|
|
|
return await database.update(tableName,{
|
|
|
|
'title': title,
|
|
|
|
'subtitle': subtitle,
|
|
|
|
'icon': _iconDataToString(icon),
|
|
|
|
},
|
|
|
|
where: 'id = ?',
|
|
|
|
conflictAlgorithm: ConflictAlgorithm.rollback,
|
|
|
|
whereArgs: [id],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
print('Error updating habit: $e');
|
|
|
|
return Future.error(e);
|
|
|
|
}
|
2024-05-12 00:08:54 +02:00
|
|
|
}
|
2024-05-12 17:56:36 +02:00
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
@override
|
2024-05-12 00:08:54 +02:00
|
|
|
Future<void> delete(int id) async {
|
2024-05-28 21:59:44 +02:00
|
|
|
try {
|
|
|
|
final database = await HabitDatabase().database;
|
|
|
|
await database.delete(tableName, where: 'id = ?', whereArgs: [id]);
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
print('Error deleting habit: $e');
|
|
|
|
return Future.error(e);
|
|
|
|
}
|
2024-05-12 00:08:54 +02:00
|
|
|
}
|
2024-05-13 23:31:03 +02:00
|
|
|
|
2024-05-28 21:59:44 +02:00
|
|
|
@override
|
2024-05-13 23:31:03 +02:00
|
|
|
Future<int?>? updateCompletionStatus(int id, bool isCompleted) async {
|
2024-05-28 21:59:44 +02:00
|
|
|
try {
|
|
|
|
final database = await HabitDatabase().database;
|
|
|
|
return await database.update(tableName,{
|
2024-05-30 14:28:21 +02:00
|
|
|
'isComplete': isCompleted ? 1 : 0,
|
2024-05-28 21:59:44 +02:00
|
|
|
},
|
|
|
|
where: 'id = ?',
|
|
|
|
conflictAlgorithm: ConflictAlgorithm.rollback,
|
|
|
|
whereArgs: [id],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
print('Error updating completion status: $e');
|
|
|
|
return Future.error(e);
|
|
|
|
}
|
2024-05-13 23:31:03 +02:00
|
|
|
}
|
2024-05-28 21:59:44 +02:00
|
|
|
}
|