You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 lines
3.4 KiB

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<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
Future<Database> _initDatabase() async {
String path = join(await getDatabasesPath(), 'problems.db');
return await openDatabase(path, version: 1, onCreate: _onCreate);
}
Future<void> _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<int> insertProblem(Problem problem) async {
final db = await database;
problem.id = const Uuid().v4();
return await db.insert(_tableName, problem.toMap());
}
Future<int> updateProblem(Problem problem) async {
final db = await database;
return await db.update(
_tableName,
problem.toMap(),
where: 'id = ?',
whereArgs: [problem.id],
);
}
Future<int> deleteProblem(String id) async {
final db = await database;
return await db.delete(_tableName, where: 'id = ?', whereArgs: [id]);
}
/// 通用查询方法
/// 根据可选的参数筛选问题。
/// 时间范围、
/// 上传状态
/// 绑定状态
Future<List<Problem>> getProblems({
DateTime? startDate,
DateTime? endDate,
String? uploadStatus, // '已上传', '未上传', '全部'
String? bindStatus, // '已绑定', '未绑定', '全部'
}) async {
final db = await database;
// 使用可变列表来构建筛选条件
final List<String> whereClauses = [];
final List<dynamic> 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<Map<String, dynamic>> 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]);
});
}
}