我正在使用Realm数据库构建Android应用程序。
我有一个名为RealmObject
的{{1}}子类,其中包含Article
字段(' s和id
以及int
)。我想向查询传递一个@PrimaryKey
s(int
,Set
或其他)文章ID的列表,并仅检索这些文章。
在SQL中会是这样的:
int[]
我已经看到可以在this StackOverflow question的iOS中执行此操作。
我怎样才能在Android中执行此操作?谢谢!
修改:为了通知,我也在GitHub回购here上询问了这个问题。
答案 0 :(得分:24)
更新:
Realm 1.2.0添加了RealmQuery.in()
以便与多个值进行比较。 The documentation详细说明了所有可用的重载。如果我们的ID是Integer
s:
public RealmQuery<E> in(String fieldName, Integer[] values)
原始回答:
如果id列表为空,@ ChristianMelchior的答案将返回所有文章。我希望它返回一个空的RealmResults<Article>
。这就是我最终做的事情;
Set<Integer> articleIds = this.getArticleIds();
RealmQuery<Article> query = realm.where(Article.class);
if (articleIds.size() == 0) {
// We want to return an empty list if the list of ids is empty.
// Just search for an id that does not exist.
query = query.equalTo("id", -30000);
} else {
int i = 0;
for (int id : articleIds) {
// The or() operator requires left hand and right hand elements.
// If articleIds had only one element then it would crash with
// "Missing right-hand side of OR"
if (i++ > 0) {
query = query.or();
}
query = query.equalTo("id", id);
}
}
return query.findAll();
答案 1 :(得分:4)
现在,领域v 1.2.0支持RealmQuery.in()
以便与多个值进行比较。
答案 2 :(得分:3)
The Realm Java API's doesn't support this yet unfortunately. You can follow the feature request here https://github.com/realm/realm-java/issues/841
The current work-around would be to build up the query yourself in a for-loop:
RealmResults<Article> articles = realm.allObjects(Article.class);
RealmQuery q = articles.where();
for (int id : ids) {
q = q.equalTo("id", id);
}
RealmResults<Article> filteredArticles = q.findAll();
答案 3 :(得分:2)
这是Realm从1.2.0开始的方式:
public RealmQuery<E> in(String fieldName, String[] values) {
if (values == null || values.length == 0) {
throw new IllegalArgumentException(EMPTY_VALUES);
}
beginGroup().equalTo(fieldName, values[0]);
for (int i = 1; i < values.length; i++) {
or().equalTo(fieldName, values[i]);
}
return endGroup();
}
以前this就是这样做的
答案 4 :(得分:1)
我刚刚看到这篇文章,我想我可以在这上面投入2美分。尽管我很欣赏Christian Melchior和他的答案,但我认为在这种情况下他的答案是行不通的(至少在当前版本中)。
我更喜欢这样做 - 我个人认为它比Albert Vila的答案更具可读性:
runfile('E:/python_practice/task2/gen1.py', wdir='E:/python_practice/task2')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile
execfile(filename, namespace)
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 88, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
File "E:/python_practice/task2/gen1.py", line 10, in <module>
from xlutils.copy import copy
ImportError: No module named 'xlutils'