Android LENGTH()条件中的绑定查询参数无效

Android LENGTH()条件中的绑定查询参数无效,android,sqlite,Android,Sqlite,我很难找到关于这个问题的任何信息,但这似乎是SQLite的一个局限性 考虑一个包含两个字段的简单单词表,_idint和word text。以下查询工作并返回预期结果,即所有12个字符或更少的单词: SELECT * FROM words WHERE LENGTH(word) <= 12; 但是,如果此字符限制需要是动态的,并且需要设置为参数,则查询将不再工作。 它返回表中的所有行: String query = "SELECT * FROM words WHERE LENGTH(word

我很难找到关于这个问题的任何信息,但这似乎是SQLite的一个局限性

考虑一个包含两个字段的简单单词表,_idint和word text。以下查询工作并返回预期结果,即所有12个字符或更少的单词:

SELECT * FROM words WHERE LENGTH(word) <= 12;
但是,如果此字符限制需要是动态的,并且需要设置为参数,则查询将不再工作。 它返回表中的所有行:

String query = "SELECT * FROM words WHERE LENGTH(word) <= ?";
Cursor cursor = database.rawQuery(query, new String[]{ Integer.toString(12) });
我还尝试选择长度作为新列,然后将条件应用于该列,但结果相同:

String query = "SELECT w.*, LENGTH(w.word) AS word_length FROM words w WHERE word_length <= ?";
Cursor cursor = database.rawQuery(query, new String[]{ Integer.toString(12) });

我唯一的选择是在之后过滤查询结果吗?为什么正常INT列上的参数化条件有效,但长度无效?e、 g.何处_id<?工作正常

当然,只要我完成此操作,我就可以通过将字段强制转换为整数来找到解决方法:

String query = "SELECT * FROM words WHERE CAST(LENGTH(word) AS INTEGER) <= ?";
Cursor cursor = database.rawQuery(query, new String[]{ Integer.toString(12) });

似乎过多了,但我猜LENGTH的返回值不被认为是整数。我遇到的所有文档都说它返回字符数

您尝试过integer.parseInt吗?我认为您的查询需要一个整数参数,您正在将其转换为字符串:

使用以下语句执行的sql语句:

rawQuery(query, new String[]{ Integer.toString(12) });
是:


这是“12”到12的隐式转换,因为你对它应用了一个数字运算。

谢谢,这很有意义-我想让我不感兴趣的主要问题是为什么像_idno这样的整型字段没有这个问题。SQLite的此功能不适用于列值和表达式,如castlengthword as int或sumlengthword,因为它们都强制转换为整数。
SELECT * FROM words WHERE LENGTH(word) <= '12';
SELECT * FROM words WHERE LENGTH(word) <= 12;
String query = "SELECT * FROM words WHERE LENGTH(word) <= ? + 0";