播放记录产生两条的bug分析及解决

原创 2016年08月31日 11:00:55

测试同学提了一个播放记录的bug,在测试环境,同一个专辑产生了两条播放记录。

1.通过查看本地数据库( sqlite3 ),发现确实有两条播放记录,

22439706|22439706|381931|0||2016-08-24 18:46:28|谁的青春不迷茫 不一样又怎么样。。

-22439706|22439706|381931|||2016-08-24 18:36:34|谁的青春不迷茫 不一样又怎么样。。


两条播放记录,只有专辑id不一样,一个等于视频id,一个等于负的视频id。

2.通过查看服务端数据,发现返回的播放记录里只有一条,并且如下:

videoName:谁的青春不迷茫 不一样又怎么样。。
pid:22439706
iptvAlbumId:22439706

videoInfoId:22439706

跟客户端有且只有一条是对应的,并且专辑id与视频id相等。

3.播放记录的产生是根据播放列表的,查看播放列表数据,只有一条相关的:

videoId: 22439706
categoryId: 30
albumId: 0
img: http://i3.letvimg.com/lc03_yunzhuanma/201504/08/16/05/fdb6371d08dfb40d64559fb6cd86842d_29339566/thumb/2_400_300.jpg
name: 谁的青春不迷茫 不一样又怎么样。。

专辑id为0。

4.查看客户端代码,有一段逻辑是,保存数据至本地时,专辑id如果=0,取视频id的负值,并保存在本地。

接下来是上传并保存至服务端,本来客户端代码原本的意图是,如果(单片的播放记录本地专辑id为负,上传服务器时,恢复为0),但是,因为共用同一个model值,如图一,结果上传的是保存至本地时修改后的值,即视频id的负值。

而服务端会对负的专辑id做兼容,转换为正的专辑id;导致本地有两条播放记录,一条专辑id是本地保存的负的视频id,一条是服务端传过来的正的视频id。






图一:


PlayHistoryProviderUtils.java

/**
 * insert playHistorys by roleid
 *
 * @param roleId
 * @param values
 * @return
 */
public static int insertPlayHistory(Long roleId, ContentValues values) {
    int insertCount = -1;
    if (values == null) {
        return insertCount;
    }
    PlayHistoryModel model = PlayHistoryUtils.combinePlayHistoryModel(values);
    try {
        insertCount = getHistoryDBManager(roleId)
                .updateToLocalDB(model);
        log("savePlayHistory insertCount = " + insertCount);
        if (insertCount > 0) {
            insertUptoServer(getContext(), model);
        }
    } catch (Exception ex) {
        log("savePlayHistory failed: " + ex);
        ex.printStackTrace();
    }
    return insertCount;
}





PlayHistoryUtils.java

public static PlayHistoryModel combinePlayHistoryModel(ContentValues values) {
    PlayHistoryModel playHistoryModel = new PlayHistoryModel();
    String aid = values.getAsString(HistoryFieldConstants.QUERY_FIELD_AID);
    // 单片的播放记录本地专辑id为负,上传服务器时,恢复为0
    playHistoryModel.setIptvAlbumId((StringUtils.equalsNull(aid) || Integer
            .parseInt(aid) < 0) ? 0 : Long.valueOf(aid));


图三:


PlayHistoryDBManager.java

private int saveHistoryToLocal(PlayHistoryModel model) throws SQLException {
    if (model == null) {
        return -1;
    }
    if (model.getIptvAlbumId() == null || model.getIptvAlbumId() == 0) {// 单片以-videoid
        // 作为专辑id(主键)存数据库
        if (model.getVideoInfoId() == null) {
            return -1;
        }
        model.setIptvAlbumId(-model.getVideoInfoId());
    }




5.修改方案:本地和上传服务端使用的model对象独立。如下图


图四


PlayHistoryProviderUtils.java

/**
 * insert playHistorys by roleid
 *
 * @param roleId
 * @param values
 * @return
 */
public static int insertPlayHistory(Long roleId, ContentValues values) {
    int insertCount = -1;
    if (values == null) {
        return insertCount;
    }

    try {
        PlayHistoryModel localModel = PlayHistoryUtils.combinePlayHistoryModel(values);
        insertCount = getHistoryDBManager(roleId)
                .updateToLocalDB(localModel);
        log("savePlayHistory insertCount = " + insertCount + ", historyModel = " + localModel);
        if (insertCount > 0) {
            PlayHistoryModel serverModel = PlayHistoryUtils.combinePlayHistoryModel(values);
            insertUptoServer(getContext(), serverModel);
        }
    } catch (Exception ex) {
        log("savePlayHistory failed: " + ex);
        ex.printStackTrace();
    }
    return insertCount;
}



Bug产生的原因有

开发人员完成功能后,需要自测: 开发过程中:每个工程师都希望能再前期就能将功能梳理完毕 自测意思是只在自己的手机上 Code Review ...
  • u011904605
  • u011904605
  • 2016年08月01日 16:02
  • 1452

深入BUG分析

BUG不是纸面数据,数据为王的时代,BUG应该为测试、应该为质量提供更多的信息。...
  • u012841352
  • u012841352
  • 2016年05月31日 06:25
  • 2367

项目管理之bug数减少原因分析和解决办法

我们项目中减少缺陷的方法。
  • qq455276333
  • qq455276333
  • 2016年07月09日 14:18
  • 16309

bug产生的原因

功能与数据库耦合: 单纯查询: #由于数据非常复杂,sql错误 #由于数据归类非常复杂,研发对待查询的数据理解错误,导致错误的sql语句 #由于研发采用了某些查询策略,导致了数据查询的延迟 ...
  • cidiwuyin
  • cidiwuyin
  • 2017年02月15日 17:47
  • 501

定位Bug技巧总结

解决Bug是编程人员的天职(创造Bug算是一种天赋吧),甚至有人这么认为:开发人员的能力可以依据他能决解Bug的复杂程度来评定。简单的Bug大多数程序员是靠臆断来解决的,但是当Bug隐藏在代码的最深处...
  • sinat_25141403
  • sinat_25141403
  • 2016年05月03日 20:11
  • 3092

bug报告模板

Bug报告编写模板 BUGID Bug的唯一标志,由bug管...
  • Smilings
  • Smilings
  • 2006年07月05日 14:36
  • 6718

两条记录合并一条的 sql

select          eu.ID, eu.UID, eu.ID_NO, eu.USER_NICK, eu.USER_NAME, eu.PWD_DIGEST, eu.PWD_SAL...
  • u011202334
  • u011202334
  • 2016年03月21日 12:02
  • 1498

mysql 计算相邻两条记录的时间差

比如排序之后我们想计算两条相邻记录的时间差,因为mysql没有窗口函数所以要么模拟窗口函数要么使用表自关联,现有如下表数据: 单独只有这些信息使用自关联没有约束条件,这时候我们可以使用增加一个序号的...
  • tangpengh
  • tangpengh
  • 2016年11月15日 14:59
  • 4127

移动端常见Bug(1)

1、关于 iOS 系统中,中文输入法输入英文时,字母之间可能会出现一个六分之一空格 可以通过正则去掉 ? 1 this.value ...
  • xxy77721
  • xxy77721
  • 2017年09月27日 19:46
  • 216

mysql&nbsp;获取指定记录的相邻的记录

恩,今天做项目时,需要对相邻的两个模块进行拖动换位,有些是HTML5的代码,这里不添加了,重要的是写sql语句时获取相邻记录的id,然后根据id,把他们的ordernums 进行互换就好了,现在的问题...
  • feiniu5566
  • feiniu5566
  • 2013年10月30日 11:54
  • 1117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:播放记录产生两条的bug分析及解决
举报原因:
原因补充:

(最多只允许输入30个字)