用个例子来解释下最近遇到一个问题。java
在android sqlite3命令行中执行create table t(a)建立表。这里不指定a的具体类型。android
而后执行insert into t values(0)。sql
若是我在sqlite3命令行中使用"select * from t where a = 0",能查询成功;若是是“select * from t where a='0'”,则失败。数据库
缘由是我在调用values.put("a", 0);时,0是整型,因此数据库中认为是数字。因此where中使用'0',数据库不知道该column应该使用什么类型,因此不会转化成数字,因此查询不到东西。命令行
若是create table t(a integer),具体指定a的类型为integer,则两条语句都会查询成功。sqlite
由于sql解析器知道该列的具体类型,因此即便指定string的'0'进来,仍然能够自动转化为数字0,而后再查询。string
在java编写程序的时候的时候,由于SQLiteDatabase.rawQuery中若是指定sql参数必须为String类型,因此若是在建立table时不指定具体类型,那string就不会自动转化为数字,那么查询就会失败。it