import 'dart:async'; import 'dart:io'; import 'package:path/path.dart'; import 'package:photos/models/memory.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path_provider/path_provider.dart'; class MemoriesDB { static final _databaseName = "ente.memories.db"; static final _databaseVersion = 1; static final table = 'memories'; static final columnFileID = 'file_id'; static final columnSeenTime = 'seen_time'; MemoriesDB._privateConstructor(); static final MemoriesDB instance = MemoriesDB._privateConstructor(); static Database _database; Future get database async { if (_database != null) return _database; _database = await _initDatabase(); return _database; } _initDatabase() async { Directory documentsDirectory = await getApplicationDocumentsDirectory(); String path = join(documentsDirectory.path, _databaseName); return await openDatabase( path, version: _databaseVersion, onCreate: _onCreate, ); } Future _onCreate(Database db, int version) async { await db.execute(''' CREATE TABLE $table ( $columnFileID INTEGER PRIMARY KEY NOT NULL, $columnSeenTime TEXT NOT NULL ) '''); } Future clearMemoriesSeenBeforeTime(int timestamp) async { final db = await instance.database; return db.delete( table, where: '$columnSeenTime < ?', whereArgs: [timestamp], ); } Future markMemoryAsSeen(Memory memory, int timestamp) async { final db = await instance.database; return await db.insert(table, _getRowForSeenMemory(memory, timestamp), conflictAlgorithm: ConflictAlgorithm.replace); } Future> getSeenTimes() async { final db = await instance.database; return _convertToSeenTimes(await db.query(table)); } Map _getRowForSeenMemory(Memory memory, int timestamp) { var row = new Map(); row[columnFileID] = memory.file.generatedID; row[columnSeenTime] = timestamp; return row; } Map _convertToSeenTimes(List> rows) { final seenTimes = Map(); for (final row in rows) { seenTimes[row[columnFileID]] = int.parse(row[columnSeenTime]); } return seenTimes; } }