一、本周进展
本周主要针对数据库不完善的地方进行了优化。
二、具体改进
1. 游戏数据同步机制
问题分析 :游戏数据无法自动同步到后端数据库,主要原因包括:
- 缺少同步状态标记字段
- 部分游戏直接调用本地存储,绕过同步逻辑
- 同步成功后未更新状态
解决方案 :
// 在训练记录表中添加 synced 字段 private const val COLUMN_SYNCED = "synced" // 同步逻辑 suspend fun syncAllHistoryRecords(): Int = withContext(Dispatchers.IO) { val localRecords = dbHelper.getUnsyncedRecords() if (localRecords.isEmpty()) return@withContext 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, role |
| children | 孩子档案 | id, name, age, info(诊断结果) |
| parent_child_relation | 亲子关系 | parent_user_id, child_id |
| training_records | 训练记录 | child_id, game_id, raw_score, stars_earned, completion_time_sec |
4. 数据可视化支持
为方便家长端查看孩子的训练数据,设计了以下常用查询接口:
-- 获取某孩子近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 项目不仅是一个技术实现,更是对自闭症儿童康复事业的一份贡献。通过游戏化的方式,我们希望能够帮助更多自闭症儿童在快乐中成长,为他们的家庭带来希望。