将null作为Integer值插入数据库

时间:2011-11-09 10:38:53

标签: android database

我正在尝试将空值存储到数据库中,但每次加载值时我都会得到0。

我声明该字段就像“intVal integer"

一样

这是我检索它的方式:

Integer x;

x = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X));

这可靠吗?还是未定义?

所以在我看来,无法将null保存为未定义的整数值

非常感谢

3 个答案:

答案 0 :(得分:15)

来自the getInt() documentation

  

以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);
}