2026山东大学软件学院项目实训个人博客(七)
·
一、本周进展
本周主要针对数据库不完善的地方进行了优化。
二、具体改进
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 项目不仅是一个技术实现,更是对自闭症儿童康复事业的一份贡献。通过游戏化的方式,我们希望能够帮助更多自闭症儿童在快乐中成长,为他们的家庭带来希望。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)