我正在尝试将空值存储到数据库中,但每次加载值时我都会得到0。
我声明该字段就像“intVal integer"
这是我检索它的方式:
Integer x;
x = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X));
这可靠吗?还是未定义?
所以在我看来,无法将null保存为未定义的整数值
非常感谢
答案 0 :(得分:15)
以int形式返回请求列的值。 结果以及当列值为null时,此方法是否抛出异常,列类型不是整数类型,或者整数值超出范围[Integer.MIN_VALUE,Integer.MAX_VALUE]是实现定义的。
所以,这是一个你不应该依赖的实现细节。
你仍然可以得到你想要的效果:你只需在读取值之前进行空检查。
int index = cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X);
Integer x = null;
if (!cursor.isNull(index)
x = cursor.getInt(index);
// now x is either null or contains a valid value
答案 1 :(得分:0)
SQLite是动态类型的。由于您定义了Integer类型的列,并且它没有找到值,因此根据提示返回0。
尝试使用String作为列的类型
答案 2 :(得分:0)
正如Rajdeep Dua所说,SQLite使用动态类型。以下是documentation所说的内容:
大多数SQL数据库引擎(除了以外的每个SQL数据库引擎) 据我们所知,SQLite使用静态,严格的类型。随着静态 输入时,值的数据类型由其容器确定 - 存储值的特定列。
SQLite使用更通用的动态类型系统。在SQLite中 值的数据类型与值本身相关联,而不是与其相关联 容器
Android文档说明当列值为null
时,getInt()的结果是实现定义的。对我来说,它也会返回0。
所以我使用了getString(),虽然此方法的结果也是实现定义的,但对于我来说,当列值为null
时返回null
,或者包含否则就是数字。
所以代码看起来像这样:
Strint strVal = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X));
if(strVal != null){
int intVal = Integer.parseInt(strVal);
}