Android 或使用SelectArg在Select中选择以转义字符
我正在使用QueryBuilder构造内部SQL,稍后将在原始SQL中使用该SQL,以避免手动转义无效字符Android 或使用SelectArg在Select中选择以转义字符,android,ormlite,Android,Ormlite,我正在使用QueryBuilder构造内部SQL,稍后将在原始SQL中使用该SQL,以避免手动转义无效字符 SelectArg-friendsIN=new-SelectArg(friends-sernames); QueryBuilder qb=myObjectDao.QueryBuilder(); qb.选择原始(“用户名”,“最晚时间为最长时间”).groupBy(“用户名”)。其中() .in(“用户名”,friendsIN); 字符串innerSelect=pq.getStatement
SelectArg-friendsIN=new-SelectArg(friends-sernames);
QueryBuilder qb=myObjectDao.QueryBuilder();
qb.选择原始(“用户名”,“最晚时间为最长时间”).groupBy(“用户名”)。其中()
.in(“用户名”,friendsIN);
字符串innerSelect=pq.getStatement();
friendsUsernames
定义为ArrayList
然后我使用innerSelect
构建外部选择:
String select=“选择w.id FROM(“+innerSelect+”)作为x内部连接myObject作为w on w.username=x.username和w.time=x.latestTime”;
GenericRawResults=myObjectDao.queryRaw(选择);
但是,正如预期的那样,innerString
具有“?”
,当我在myObjectDao
上调用queryRaw
时,我没有得到任何结果。我尝试将friendsUsername作为数组提供给queryRaw:
GenericRawResults=
myObjectrDao.queryRaw(选择,
toArray(新字符串[friendsUsernames.size()]);
但我得到了以下错误:
android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException:
bind or column index out of range: handle 0x17a22e8
关于如何使用OrmLite完成此类查询,有什么建议吗?是的,那是行不通的。您的查询中只有一个
?
,但您正试图传入一个用户名数组。?
SQL参数的数量与传递给queryRaw(…)
方法的参数数量之间必须存在1对1的对应关系
如果friendsUsernames
的大小是固定的,那么您应该能够执行如下操作,生成类似于“in(?,,?,?)”的SQL:
List-friendsInList=new-ArrayList();
对于(int i=0;i
但是,如果名称列表是动态的,那么您必须动态地执行此操作,因为?
的数量必须与传递给queryRaw(…)
方法的参数数量完全匹配。是的,这不起作用。您的查询中只有一个?
,但您正试图传入一个用户名数组。?
SQL参数的数量与传递给queryRaw(…)
方法的参数数量之间必须存在1对1的对应关系
如果friendsUsernames
的大小是固定的,那么您应该能够执行如下操作,生成类似于“in(?,,?,?)”的SQL:
List-friendsInList=new-ArrayList();
对于(int i=0;i
但是,如果名称列表是动态的,那么您必须动态地执行此操作,因为?
的数量必须与传递给queryRaw(…)
方法的参数数量完全匹配。谢谢,我没有考虑过这种方法。我假设一个?
将允许我绑定字符串数组。对于像我这样在原始查询中忘记设置参数的人:不要忘记在原始查询中包含所有参数的数组作为第二个参数!queryRaw(bondQb.prepareStatementString(),argArray);谢谢,我没有想到那种方法。我假设一个?
将允许我绑定字符串数组。对于像我这样在原始查询中忘记设置参数的人:不要忘记在原始查询中包含所有参数的数组作为第二个参数!queryRaw(bondQb.prepareStatementString(),argArray);
List<SelectArg> friendsInList = new ArrayList<SelectArg>();
for (int i = 0; i < NUM_FRIENDS; i++) {
// it doesn't matter what the value is since you just want the ?
fieldsInList.add(new SelectArg());
}
...in("name", friendsInList);