Android 参数化 sql 查询不起作用

标签 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
            + "));");

最佳答案

我认为问题是你的第二个 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/

相关文章:

android - 移动支付库转账问题

java - 从 Activity 到 Fragment

SQLite 插入问题 – 错误 : no such column

c++ - 当绑定(bind)发生在另一个函数中时,Sqlite _only_ 找不到行

android - 使用android在字符串中添加双引号

java - Android Function 返回一个数组直接变成变量

java - 当我的闹钟触发 onReceive() 时,通知未显示

android - 如何在 Android SQLite 中使用 TRIGGER

c# - 带有四个 && 的 LINQ Where 子句

objective-c - NSDocument 与 sqlite 记录