一、本周进展

        本周主要针对数据库不完善的地方进行了优化。

二、具体改进

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 项目不仅是一个技术实现,更是对自闭症儿童康复事业的一份贡献。通过游戏化的方式,我们希望能够帮助更多自闭症儿童在快乐中成长,为他们的家庭带来希望。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐