2026山东大学软件学院项目实训个人博客(七) 一、本周进展本周主要针对数据库不完善的地方进行了优化。二、具体改进1. 游戏数据同步机制问题分析 游戏数据无法自动同步到后端数据库主要原因包括- 缺少同步状态标记字段- 部分游戏直接调用本地存储绕过同步逻辑- 同步成功后未更新状态解决方案 // 在训练记录表中添加 synced 字段 private const val COLUMN_SYNCED synced // 同步逻辑 suspend fun syncAllHistoryRecords(): Int withContext(Dispatchers.IO) { val localRecords dbHelper.getUnsyncedRecords() if (localRecords.isEmpty()) returnwithContext 0 val recordsToSync localRecords.map { record - mapOf( record_id to (record[id] as? Int ?: 0), child_id to (record[childId] as? Int ?: 0), game_id to (record[gameId] as? Int ?: 0), raw_score to (record[score] as? Int ?: 0), normalized_score to (record[score] as? Int ?: 0), stars_earned to 0, completion_time_sec to (record[duration] as? Int ?: 0), errors to 0, hints_used to 0, is_completed to (record[isCompleted] as? Boolean ?: true), created_at to (record[date] as? String ?: ) ) } val count backendRepo.syncTrainingRecordsBatch(recordsToSync) recordsToSync.forEach { record - val recordId record[record_id] as? Int if (recordId ! null recordId 0) { dbHelper.markRecordAsSynced(recordId.toLong()) } } count }2. 一键同步功能在个人中心页面添加了同步按钮方便用户手动触发数据同步// ProfilePage.kt MenuItem( text { Text( 同步数据到服务器) }, onClick { coroutineScope.launch { isSyncing true val count gameRepository?.syncAllHistoryRecords() ?: 0 isSyncing false val message if (count 0) { 同步成功已同步 $count 条训练记录 } else { 没有需要同步的记录 } Toast.makeText(context, message, Toast.LENGTH_SHORT).show() } }, enabled !isSyncing )3. 数据库结构设计表名功能核心字段users用户信息id, username, password_hash, rolechildren孩子档案id, name, age, info(诊断结果)parent_child_relation亲子关系parent_user_id, child_idtraining_records训练记录child_id, game_id, raw_score, stars_earned, completion_time_sec4. 数据可视化支持为方便家长端查看孩子的训练数据设计了以下常用查询接口-- 获取某孩子近7天的训练统计 SELECT DATE(created_at) as date, COUNT(*) as total_games, AVG(stars_earned) as avg_stars, SUM(completion_time_sec) as total_time FROM training_records WHERE child_id ? AND created_at DATE(now, -7 days) GROUP BY DATE(created_at); -- 获取各游戏的平均成绩 SELECT g.name as game_name, COUNT(*) as play_count, AVG(tr.raw_score) as avg_score FROM training_records tr JOIN games g ON tr.game_id g.id WHERE tr.child_id ? GROUP BY tr.game_id;5. 测试数据初始化为方便开发和测试生成了完整的测试数据- 100个用户 奇数ID为孩子(c1-c50)偶数ID为家长(p1-p50)- 50个孩子档案 包含姓名、年龄、诊断信息- 5000条训练记录 覆盖近半个月包含10种游戏类型6. 遇到的困难与解决方案挑战解决方案游戏数据不同步添加 synced 字段追踪同步状态部分游戏绕过同步逻辑统一使用 onComplete 回调模式数据量大查询慢建立索引和优化查询语句三、未来规划和总结1. AI智能分析 基于训练数据为每个孩子生成个性化训练建议2. 实时同步 使用 WebSocket 实现数据实时同步3. 数据可视化 提供更丰富的图表展示训练进度StarMate 项目不仅是一个技术实现更是对自闭症儿童康复事业的一份贡献。通过游戏化的方式我们希望能够帮助更多自闭症儿童在快乐中成长为他们的家庭带来希望。