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

2015-08-09 09:07:24 +08:00
 20015jjw

`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

2036 次点击
所在节点    问与答
9 条回复
loveyu
2015-08-09 09:23:18 +08:00
直接存字符串能成功么?如果可以就取得时候手动转换吧
q5we66fg
2015-08-09 11:08:20 +08:00
表示感兴趣,最好给出断言前后的代码还有表的结构
20015jjw
2015-08-09 12:00:35 +08:00
@loveyu 可能这也是个办法 我现在干脆只check那个数字的前几位了...
20015jjw
2015-08-09 12:01:53 +08:00
@q5we66fg 在29行中 如果不添加`substring` 就会得到题述bug 能麻烦看看太感谢了!
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
2015-08-09 12:14:36 +08:00
如果直接执行
assertEquals(expectedValue.substring(0, 6), gotValue.substring(0, 6));
这个呢
20015jjw
2015-08-09 13:12:49 +08:00
@ufo22940268
现在我写的是考虑到有的Entry长度不足6,Java又不支持超长度的slicing,就只能预先判断expectedValue和gotValue的长度是不是超过6,如果超过就切到前6个,否则保留,然而这个办法实在是很低级。至于你的第二条回复,没有改善。

这个问题实在是太奇妙了,如果我输入的经纬后面小数位数小于4,就不会报错,等于或者多于4,就会被缩掉一位。不是每次都会被缩到3位,而是如果后面小数有6位,就会被缩到5位。。。
freeznet
2015-08-09 14:40:37 +08:00
问题应该出在java从sqlite获取数据后转换成你想要的数据类型上, 因为sqlite本身是没有类型定义的, 所有数据都是以字符串储存, 然后再在应用场景中转换成对应的类型的.
这种时候我觉得应该先确定到底是储存的时候数据就错了 还是取出的时候把对的数据变成了错的
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的时候加上字符串,妥妥滴。

我只是推测。没有写代码实验,问题应该出在这里。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/211848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX