3

如果我将一个数字硬编码到 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
            + "));");
4

1 回答 1

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 的类型亲和性工作

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

于 2013-04-02T16:29:40.470 回答