播放记录产生两条的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,前端用的AngularJs,后台是SpringMVC,持久用的hibernate,跟后台断点时查询数据库返回一条数据,否则返回两条,以下是问题详述

我在做一个系统,有一个银行下拉,当银行的钱全部转出的时候则下拉不显示该银行,进入该界面的时候会初始化该银行下拉,我在点击【转出】按钮的时候在里面再一次调用了查询银行下拉的方法,结果出现了跟debug到...

mysql查询(同一个表中相邻的两条记录进行运算)

应用:同一个表中相邻的两条记录进行运算中的cpu_busy,cpu_total。   cpu_total=usr+nice+sys+idle+iowait+irq+softirq;   cpu...

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

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

图的广度优先查找(BFS: Breadth -First Search) (1)问题分析 BFS的策略是尽可能广泛地搜索图。它首先访问所有和初始顶点邻接的顶点,然后访问距离它两条边的所有未

图的广度优先查找(BFS: Breadth -FirstSearch) (1)问题分析      BFS的策略是尽可能广泛地搜索图。它首先访问所有和初始顶点邻接的顶点,然后访问距离它两条边的所有未...

oracle 根据时间排序,删除相邻的除排序字段均相同的两条中较新的一条记录

问题描述:将表数据根据时间进行排序,若其中有相邻两条记录,除了时间字段外均相同,则删除两条中较新的一条记录(如下图) 解决方法: 1.建表并插入数据 create table t (id va...

处理出租车计价器数据,计算空驶时间,即相邻两条记录相减

处理出租车计价器数据,计算空驶时间,即相邻两条记录相减 原始数据如下:select id 编号,car_code 车牌号 ,DEAL_TIME 下车时间,DAY_TIME 上车时间 from DAT_...

mysql_交换指定两条记录的某个字段的值

今天在用mysql操作时遇到了下面的问题 : You can't specify target table ‘quenn’ for update in FROM clause 原因:mysql不能先...

关于两条链表交叉(交叉有环)的问题解决

大晚上睡不着,脑海里忽然出现关于链表的问题,可能是我晚上思考会比较冷静,不那么浮躁的原因,所以想到一些解决方法。 一、关于链表交叉 两条链表有交叉,最后会走到一起,如下面的丑图: 问题1,如何判断...

开源控件NumberCircleProgressBar(圆形进度条)存在两条线的解决方法

NumberCircleProgressBar是网上流传较广的一个圆形进度条控件,但是今天使用的过程中发现这个控件存在一个小问题,就是当你使用Rising_Water这个模式的时候,会出现两条细细的线...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:播放记录产生两条的bug分析及解决
举报原因:
原因补充:

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