at:华米 /2018.5.21

数据库迁移

6版本和7版本之间有一个字段的数据类型由int32-->int64.导致coredata无法自动处理。

* 小米运动的CoreData数据库迁移目前采用了自动推断管理方式。在这种模式下新增表或字段,删除表或字段基本可以保证迁移顺利完成。但是如果更改了数据类型就会存在自动管理无法处理的情况。

问题修复: 现讨论处理方案如下,有不足的欢迎大家补充。 方案一:针对还未进行数据库迁移的用户, 在新版本中删除旧的数据库文件,从新下载最新的服务器数据。并以最新版本V7创建数据库。此方案存在的风险是可能会删除用户未上传的数据。 方案二:在新版本中,按旧的数据Model读取旧版本的数据 进行旧版本数据库的手动代码迁移。次方案会更加复杂且不一定能保证可行性。短时间内很难完成修复和测试。 方案三:尝试采用渐进式迁移。即每两个连续的数据模型之间创建映射模型。


(组件化之)蓝牙模块解耦 -- 训练中心模块对接蓝牙模块
  • tag 2018.07.25

目标:将蓝牙模块和心率监测彻底从训练中心模块抽出 当前代码中问题所在:

  1. 训练中心模块现在需要检测蓝牙的连接状态
  2. 在开始监听心率的时候可以进行蓝牙的连接
  3. 在停止监测心率的时候可以断开蓝牙连接

训练中心所需功能:

  1. 开始播放视频 -> 开启心率监测 -- 获取心率可用状态status和当前心率value --> update UI
  2. 播放过程中 -> 根据当前心率更新UI,当达到最大心率,通过手环震动提醒用户
  3. 播放结束 -> 停止监测心率

由此可以得出:

  • 业务逻辑层理想状态解耦

    训练中心只需要在播放器不同的状态告诉蓝牙模块我要干什么,并给我返回status和value即可,其余额一概不关心。

  • 代码层解耦

    1. playDelegate(理想情况:训练中心的代码) 播放器在不同状态通过委托的形式将事件委托出来
    2. heartRateManage(理想情况:蓝牙模块代码) 心率管理类来接受委托的事件

      上面两步将心率相关操作抽取出来,这样不会污染训练中心的代码,即使心率功能不可用(蓝牙没有连接等)也不影响播放器正常运行

    3. heartRateManageDelegate(理想情况:蓝牙模块代码) 心率管理类再通过委托形式将返回的status和value委托出来给需要的类使用

      为了进行彻底的解耦,这里还需要一个中间件,用来桥接蓝牙两个模块的一些依赖,进行事件的转发

    4. HeartRateManageAdaptor<playDelegate, heartRateManageDelegate>

另外训练中心模块可能还需要控制手环的外部状态,比如震动等等 所以可以添加一个特征管理类,如果需要接受蓝牙返回的数据,也可以添加一个特征管理类的委托

Extension: 蓝牙模块可能不止对接一个训练中心,还可能有跑步等等 训练中心可能不止对接一个蓝牙模块,还可能对接跑步机等其他设备

参考:CLLocationManager,CLLocationManagerDelegate的设计

results matching ""

    No results matching ""