first commit
This commit is contained in:
114
lib/database/database_helper.dart
Normal file
114
lib/database/database_helper.dart
Normal file
@@ -0,0 +1,114 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user