import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; import 'package:uuid/uuid.dart'; import '../models/problem_model.dart'; class LocalDatabase { static final LocalDatabase _instance = LocalDatabase._internal(); factory LocalDatabase() => _instance; static Database? _database; static const String _tableName = 'problems'; LocalDatabase._internal(); Future get database async { if (_database != null) return _database!; _database = await _initDatabase(); return _database!; } Future _initDatabase() async { String path = join(await getDatabasesPath(), 'problems.db'); return await openDatabase(path, version: 1, onCreate: _onCreate); } Future _onCreate(Database db, int version) async { await db.execute(''' CREATE TABLE $_tableName( id TEXT PRIMARY KEY, description TEXT NOT NULL, location TEXT NOT NULL, imageUrls TEXT NOT NULL, createdAt INTEGER NOT NULL, isUploaded INTEGER NOT NULL, censorTaskId TEXT, bindData TEXT ) '''); } Future insertProblem(Problem problem) async { final db = await database; problem.id = const Uuid().v4(); return await db.insert(_tableName, problem.toMap()); } Future updateProblem(Problem problem) async { final db = await database; return await db.update( _tableName, problem.toMap(), where: 'id = ?', whereArgs: [problem.id], ); } Future deleteProblem(String id) async { final db = await database; return await db.delete(_tableName, where: 'id = ?', whereArgs: [id]); } /// 通用查询方法 /// 根据可选的参数筛选问题。 /// 时间范围、 /// 上传状态 /// 绑定状态 Future> getProblems({ DateTime? startDate, DateTime? endDate, String? uploadStatus, // '已上传', '未上传', '全部' String? bindStatus, // '已绑定', '未绑定', '全部' }) async { final db = await database; // 使用可变列表来构建筛选条件 final List whereClauses = []; final List whereArgs = []; // 根据 startDate 添加筛选条件 if (startDate != null) { whereClauses.add('createdAt >= ?'); whereArgs.add(startDate.millisecondsSinceEpoch); } // 根据 endDate 添加筛选条件 if (endDate != null) { whereClauses.add('createdAt <= ?'); whereArgs.add(endDate.millisecondsSinceEpoch); } // 根据 uploadStatus 添加筛选条件 if (uploadStatus != null && uploadStatus != '全部') { whereClauses.add('isUploaded = ?'); whereArgs.add(uploadStatus == '已上传' ? 1 : 0); } // 根据 bindStatus 添加筛选条件 if (bindStatus != null && bindStatus != '全部') { if (bindStatus == '已绑定') { whereClauses.add('censorTaskId IS NOT NULL'); } else { whereClauses.add('censorTaskId IS NULL'); } } // 将所有条件用 ' AND ' 连接起来 final String whereString = whereClauses.join(' AND '); final List> maps = await db.query( _tableName, where: whereString.isEmpty ? null : whereString, whereArgs: whereArgs.isEmpty ? null : whereArgs, orderBy: 'createdAt DESC', ); return List.generate(maps.length, (i) { return Problem.fromMap(maps[i]); }); } }