import 'package:flutter/foundation.dart' show kIsWeb; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; class DatabaseHelper { static final DatabaseHelper instance = DatabaseHelper._init(); static Database? _database; DatabaseHelper._init(); Future get database async { // Web 平台不支持 sqflite if (kIsWeb) { throw UnsupportedError('SQLite is not supported on Web platform. Use mock data instead.'); } if (_database != null) return _database!; _database = await _initDB('autotime_tracker.db'); return _database!; } Future _initDB(String filePath) async { // Web 平台不支持 sqflite if (kIsWeb) { throw UnsupportedError('SQLite is not supported on Web platform.'); } final dbPath = await getDatabasesPath(); final path = join(dbPath, filePath); return await openDatabase( path, version: 1, onCreate: _createDB, ); } Future _createDB(Database db, int version) async { // 应用使用记录表 await db.execute(''' CREATE TABLE app_usage ( id INTEGER PRIMARY KEY AUTOINCREMENT, package_name TEXT NOT NULL, app_name TEXT NOT NULL, start_time INTEGER NOT NULL, end_time INTEGER NOT NULL, duration INTEGER NOT NULL, category TEXT NOT NULL, project_id INTEGER, device_unlock_count INTEGER DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ) '''); // 每日统计表 await db.execute(''' CREATE TABLE daily_stats ( id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL UNIQUE, total_time INTEGER NOT NULL, work_time INTEGER DEFAULT 0, study_time INTEGER DEFAULT 0, entertainment_time INTEGER DEFAULT 0, social_time INTEGER DEFAULT 0, tool_time INTEGER DEFAULT 0, efficiency_score INTEGER, focus_score INTEGER, app_switch_count INTEGER DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ) '''); // 应用分类表 await db.execute(''' CREATE TABLE app_category ( id INTEGER PRIMARY KEY AUTOINCREMENT, package_name TEXT NOT NULL UNIQUE, category TEXT NOT NULL, is_custom INTEGER DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ) '''); // 时间目标表 await db.execute(''' CREATE TABLE time_goal ( id INTEGER PRIMARY KEY AUTOINCREMENT, goal_type TEXT NOT NULL, category TEXT, target_time INTEGER NOT NULL, is_active INTEGER DEFAULT 1, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ) '''); // 创建索引 await db.execute('CREATE INDEX idx_app_usage_date ON app_usage(start_time)'); await db.execute('CREATE INDEX idx_app_usage_category ON app_usage(category)'); await db.execute('CREATE INDEX idx_app_usage_package ON app_usage(package_name)'); await db.execute('CREATE INDEX idx_daily_stats_date ON daily_stats(date)'); await db.execute('CREATE INDEX idx_app_category_package ON app_category(package_name)'); } // 关闭数据库 Future close() async { final db = await database; await db.close(); } }