Scharf Beobachtet

Tech Know How

SQLite Datenbank für Flutter Anwendungen – kleines Beispiel

2021-10-30 06:57:38

Eigentlich gibt es keine richtige Anwendung, die nicht früher oder später doch Daten speichern könnte oder sollte. Sei es, das der User auf den Eintrag zurückgreifen können soll oder einen Prozess einfach fortführen kann.

Deshalb hier ein kleines Beispiel, wie man Daten speichern, abrufen und wieder löschen kann.

Der Datenbank Handler

import 'package:dices_app/models/history_entity.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHandler {
  final String tableHistoryEntities = 'history_entities';

  Future<int> insertDoneWorkout(List<HistoryEntity> workouts) async {
    int result = 0;
    final Database db = await initializeDB();
    for (var workout in workouts) {
      try {
        result = await db.insert(tableHistoryEntities, workout.toMap());
      } catch (_) {
        print("insert did not work");
      }
    }

    return result;
  }

  Future<void> deleteHistoryEntity(int id) async {
    final db = await initializeDB();
    await db.delete(
      tableHistoryEntities,
      where: "id = ?",
      whereArgs: [id],
    );
  }

  Future<int?> queryRowCount(String tableName) async {
    final db = await initializeDB();
    return Sqflite.firstIntValue(
        await db.rawQuery('SELECT COUNT(*) FROM $tableName'));
  }

  Future<List<HistoryEntity>> retrieveHistoryEntities() async {
    final Database db = await initializeDB();
    final List<Map<String, Object?>> queryResult =
        await db.query(tableHistoryEntities);
    List<HistoryEntity> hw =
        queryResult.map((e) => HistoryEntity.fromMap(e)).toList();
        
    return hw;
  }

  Future<Database> initializeDB() async {
    String path = await getDatabasesPath();
    return openDatabase(
      join(path, 'database_1.db'),
      onCreate: (database, version) async {
        await database.execute(
          "CREATE TABLE history_entities(id INTEGER PRIMARY KEY AUTOINCREMENT, created TEXT NOT NULL,values TEXT)",
        );
      },
      version: 1,
    );
  }
}

Dieser greift auf ein Model zurück:

class HistoryEntity {
  int id = new DateTime.now().millisecondsSinceEpoch;
  String created;
  List<String> values;

  HistoryEntity({required this.values, required this.created});

  HistoryEntity.fromMap(Map<String, dynamic> res)
      : id = res["id"],
        created = res["created"],
        values = res["values"].split(",");

  Map<String, Object?> toMap() {
    return {'id': id, 'created': created, 'values': values.join(",")};
  }
}

Dies wird mit dem Handler gespeichert oder geladen. Wenn nötig kann auch gelöscht werden.

Zurück