Android 或使用SelectArg在Select中选择以转义字符

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

我正在使用QueryBuilder构造内部SQL,稍后将在原始SQL中使用该SQL,以避免手动转义无效字符

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);