Files
AutoTime-Tracker/lib/database/database_helper.dart
2025-11-13 15:45:28 +08:00

115 lines
3.3 KiB
Dart

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<Database> 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<Database> _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<void> _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<void> close() async {
final db = await database;
await db.close();
}
}