115 lines
3.3 KiB
Dart
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();
|
|
}
|
|
}
|
|
|