如果我将数字硬编码到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
+ "));");
答案 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,这就是您获得任何行的原因。
工作如果您将列定义为TEXT
,则会替换占位符,并将值与col = 'value'
进行比较。如果您将列定义为INTEGER
,则会替换占位符,并将值与col = value
进行比较。但是在你的第二个DML语句中,你没有指定列的数据类型,只是它引用了某个列的某个列。