我正在开发一个使用sugarORM的安卓应用程序。我希望获得一个与列表中的in相匹配的多个项。
但是当我打电话
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (?)", "1,2,3") 我总是得到一个空列表(尽管我使用SQLite DB浏览器双重检查了查询,并且它工作了)。
将此查询拆分为多个findById似乎效率低下。对使用SugarORM在哪里工作有什么想法吗?
发布于 2015-09-24 12:25:24
经过多次尝试,我发现替换占位符有问题。
转自:
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (?)", "1,2,3")至:
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (1,2,3)", null)解决这个问题。
发布于 2015-09-24 15:00:40
问题是SQLite转义参数"1,2,3"并将其转换为单个值,然后用于替换查询字符串中的单个?占位符。提供多个参数的正确方法是为每个单独的参数设置一个占位符。然后,您的原始代码行必须更改为:
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (?,?,?)", new String[] { "1","2","3" })稍后您指出,参数的数量是动态的。通过在运行时根据要查询的参数生成查询(特别是where子句),可以轻松地完成这一任务。
对于最一般的情况,只需几行代码即可做到这一点:
final String[] args = new String[] { /* ... */ };
final String query = "SELECT * FROM <table> WHERE <column> in " +
"(" + TextUtils.join(",", Collections.nCopies(args.length, "?")) + ")";
final List<A> result = A.findWithQuery(A.class, query, args);(请注意,您可以采取快捷方式,将参数直接插入查询字符串--而不是使用占位符--但随后您将释放SQLite的内置转义,因此我决定不使用它)
剩下要做的就是从参数中生成一个String[]。像这样的简单帮助方法应该涵盖大多数场景:
static String[] toStringArray(Object... args) {
final String[] array = new String[args.length];
for (int i = 0; i < args.length; i++) array[i] = args[i].toString();
return array;
}如果计划使用基元数组作为参数,您可能需要在其中添加一些null检查,并可能设置一些重载。
免责声明:我直接在浏览器中输入了所有内容,所以不能保证一切都正常,并且第一次尝试。:)
https://stackoverflow.com/questions/32758390
复制相似问题