V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
20015jjw
V2EX  ›  问与答

被 Android 里的 SQLite 和 JUnit 搞了好久,还是搞不定这个 bug

  •  
  •   20015jjw · 2015-08-09 09:07:24 +08:00 · 2100 次点击
    这是一个创建于 3402 天前的主题,其中的信息可能已经有所发展或是发生改变。

    `junit.framework.ComparisonFailure: Value '37.87159' did not match the expected value '37.87159'. LocationTable Error expected:<37.871[59]> but was:<37.871[6]>`

    在创建数据库的时候数据类型使用了REAL, FLOAT 和 DECIMAL(5, 5) 都没有办法解决。感觉是SQlite自己把那个数字给弄少了一位... 不知道怎么破... qwq

    第 1 条附言  ·  2015-08-09 11:59:40 +08:00
    相关代码在这里

    http://pastebin.com/v2DVtH74

    谢谢各位!
    9 条回复    2015-08-09 17:57:48 +08:00
    loveyu
        1
    loveyu  
       2015-08-09 09:23:18 +08:00
    直接存字符串能成功么?如果可以就取得时候手动转换吧
    q5we66fg
        2
    q5we66fg  
       2015-08-09 11:08:20 +08:00
    表示感兴趣,最好给出断言前后的代码还有表的结构
    20015jjw
        3
    20015jjw  
    OP
       2015-08-09 12:00:35 +08:00
    @loveyu 可能这也是个办法 我现在干脆只check那个数字的前几位了...
    20015jjw
        4
    20015jjw  
    OP
       2015-08-09 12:01:53 +08:00
    @q5we66fg 在29行中 如果不添加`substring` 就会得到题述bug 能麻烦看看太感谢了!
    ufo22940268
        5
    ufo22940268  
       2015-08-09 12:14:04 +08:00
    assertEquals("Value '" + entry.getValue().toString() +
    "' did not match the expected value '" +
    expectedValue + "'. " + error, expectedValue.substring(0, 6), gotValue.substring(0, 6));

    为什么不把 entry.getValue().toString() 替换成gotValue.substring(0, 6)
    ufo22940268
        6
    ufo22940268  
       2015-08-09 12:14:36 +08:00
    如果直接执行
    assertEquals(expectedValue.substring(0, 6), gotValue.substring(0, 6));
    这个呢
    20015jjw
        7
    20015jjw  
    OP
       2015-08-09 13:12:49 +08:00
    @ufo22940268
    现在我写的是考虑到有的Entry长度不足6,Java又不支持超长度的slicing,就只能预先判断expectedValue和gotValue的长度是不是超过6,如果超过就切到前6个,否则保留,然而这个办法实在是很低级。至于你的第二条回复,没有改善。

    这个问题实在是太奇妙了,如果我输入的经纬后面小数位数小于4,就不会报错,等于或者多于4,就会被缩掉一位。不是每次都会被缩到3位,而是如果后面小数有6位,就会被缩到5位。。。
    freeznet
        8
    freeznet  
       2015-08-09 14:40:37 +08:00
    问题应该出在java从sqlite获取数据后转换成你想要的数据类型上, 因为sqlite本身是没有类型定义的, 所有数据都是以字符串储存, 然后再在应用场景中转换成对应的类型的.
    这种时候我觉得应该先确定到底是储存的时候数据就错了 还是取出的时候把对的数据变成了错的
    thinkloki
        9
    thinkloki  
       2015-08-09 17:57:48 +08:00
    int idx = valueCursor.getColumnIndex(columnName);
    assertFalse("Column '" + columnName + "' not found. " + error, idx == -1);
    String expectedValue = entry.getValue().toString();
    String gotValue = valueCursor.getString(idx);
    你这段 valueCursor.getString(idx); 这一行代码用错了。你存储的时候第三行跟第四行的数据存的是double类型的,用这个方法cursor.getDouble()。



    要不让然的话
    ContentValues testValues = new ContentValues();
    testValues.put(WeatherContract.LocationEntry.COLUMN_LOCATION_SETTING, "Beijing");
    testValues.put(WeatherContract.LocationEntry.COLUMN_CITY_NAME, "Beijing");
    testValues.put(WeatherContract.LocationEntry.COLUMN_COORD_LAT, "39.916");
    testValues.put(WeatherContract.LocationEntry.COLUMN_COORD_LONG, "116.383");

    第三行第四行put的时候加上字符串,妥妥滴。

    我只是推测。没有写代码实验,问题应该出在这里。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2501 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:27 · PVG 10:27 · LAX 18:27 · JFK 21:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.