首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SugarORM findWithQuery和IN

SugarORM findWithQuery和IN
EN

Stack Overflow用户
提问于 2015-09-24 09:53:38
回答 2查看 1.1K关注 0票数 0

我正在开发一个使用sugarORM的安卓应用程序。我希望获得一个与列表中的in相匹配的多个项。

但是当我打电话

代码语言:javascript
复制
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (?)", "1,2,3") 

我总是得到一个空列表(尽管我使用SQLite DB浏览器双重检查了查询,并且它工作了)。

将此查询拆分为多个findById似乎效率低下。对使用SugarORM在哪里工作有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-24 12:25:24

经过多次尝试,我发现替换占位符有问题。

转自:

代码语言:javascript
复制
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (?)", "1,2,3")

至:

代码语言:javascript
复制
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (1,2,3)", null)

解决这个问题。

票数 2
EN

Stack Overflow用户

发布于 2015-09-24 15:00:40

问题是SQLite转义参数"1,2,3"并将其转换为单个值,然后用于替换查询字符串中的单个?占位符。提供多个参数的正确方法是为每个单独的参数设置一个占位符。然后,您的原始代码行必须更改为:

代码语言:javascript
复制
findWithQuery(A.class, "SELECT * FROM <table> WHERE <column> in (?,?,?)", new String[] { "1","2","3" })

稍后您指出,参数的数量是动态的。通过在运行时根据要查询的参数生成查询(特别是where子句),可以轻松地完成这一任务。

对于最一般的情况,只需几行代码即可做到这一点:

代码语言:javascript
复制
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[]。像这样的简单帮助方法应该涵盖大多数场景:

代码语言:javascript
复制
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检查,并可能设置一些重载。

免责声明:我直接在浏览器中输入了所有内容,所以不能保证一切都正常,并且第一次尝试。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32758390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档