import 'package:flutter/foundation.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import '../log/log.dart'; class Db { late Database _db; void init() async { if (kIsWeb) { Log.i("Database on web is not supported"); return; } String dbpath = 'previews.db'; if (defaultTargetPlatform == TargetPlatform.android || defaultTargetPlatform == TargetPlatform.iOS) { dbpath = join(await getDatabasesPath(), dbpath); } else { // Initialize FFI sqfliteFfiInit(); // Change the default factory databaseFactory = databaseFactoryFfi; } _db = await openDatabase( // Set the path to the database. Note: Using the `join` function from the // `path` package is best practice to ensure the path is correctly // constructed for each platform. dbpath, onCreate: (db, version) { // Run the CREATE TABLE statement on the database. return db.execute( 'CREATE TABLE previews(id INTEGER PRIMARY KEY, thumbnail BLOB)', ); }, // Set the version. This executes the onCreate function and provides a // path to perform database upgrades and downgrades. version: 1, ); } /// delete all data but keep structure Future clear() async { await _db.delete("previews"); // shrink the db file size await _db.execute("VACUUM"); } /// get db size in bytes Future getDbSize() async { final int cnt = (await Db().db().rawQuery("pragma page_count;"))[0] ["page_count"] as int; final int pagesize = (await Db().db().rawQuery("pragma page_size;"))[0]["page_size"] as int; return cnt * pagesize; } Database db() { return _db; } static final Db _singleton = Db._internal(); factory Db() { return _singleton; } Db._internal(); }