如果我将一个数字硬编码到 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
+ "));");
最佳答案
我认为问题是你的第二个 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 语句中,你没有指定列的数据类型,只是它引用了某处的某个列。
关于Android 参数化 sql 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15768678/