Android参数化sql查询不起作用

时间:2013-04-02 15:57:49

标签: android sqlite

如果我将数字硬编码到where部分,我会得到我期待的行

Cursor cursor = db.query( tableName, 
new String[] {colID, colString, colNumber },  
colNumber + "=14", 
null, 
null, null, null, null);

如果我把数字作为参数放入,我就不会有任何行。

Cursor cursor = db.query( tableName, 
new String[] {colID, colString, colNumber },  
colNumber + "=?", 
new String[] { String.valueOf(14) }, 
null, null, null, null);

在第二种情况下,我做错了什么?

创建表语句:

db.execSQL("CREATE TABLE "
        + otherTableName + " ("
        + otherTableID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + otherTableString + " TEXT"
        + ");");

db.execSQL("CREATE TABLE "
        + tableName + " ("
        + colID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + colString + " TEXT, "
        + colNumber + " REFERENCES "
        + otherTableName + "(" + otherTableID
            + "));");

1 个答案:

答案 0 :(得分:1)

我认为问题是你的第二个DML声明,更准确你的外键声明。我认为它应该是:

db.execSQL("CREATE TABLE "
        + tableName + " ("
        + colID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + colString + " TEXT, "
        + colNumber + " INTEGER, "
        + " FOREIGN KEY (" + colNumber + ") REFERENCES "
        + otherTableName + "(" + otherTableID
            + "));");

我无法解释为什么它不起作用的其他原因。除了使用硬编码值和第二个占位符之外,您的陈述是相同的。您可能在tableName表上尝试过参数化语句,我认为您错误地声明了FK,这就是您获得任何行的原因。

占位符基于SQLite's type affinity

工作

如果您将列定义为TEXT,则会替换占位符,并将值与col = 'value'进行比较。如果您将列定义为INTEGER,则会替换占位符,并将值与col = value进行比较。但是在你的第二个DML语句中,你没有指定列的数据类型,只是它引用了某个列的某个列。