简体   繁体   English

如何使用子查询和语句进行Realm查询

[英]How to make Realm query with subquery and in statement

I'm now working Realm with java, I have no idea how can I use subquery. 我现在用java工作Realm,我不知道如何使用子查询。

I have two RealmObjects like below. 我有两个像下面的RealmObjects。

public class Sms extends RealmObject {
    @PrimaryKey
    private String id;
    private String address;
}
public class Statement extends RealmObject {
    @PrimaryKey
    private String id;
    private String smsId;
}

And I want query with Realm to do same work like sql below. 我希望与Realm进行查询,以执行与下面的sql相同的工作。

SELECT
    *
FROM
    sms
WHERE
    id not in (
        SELECT
            sms_id
        FROM
            statement
    )
    and address = "123456789"
;

How can I achieve it? 我怎样才能实现它?


Update 2015-12-18 : 2015-12-18更新:

@geisshirt, many thanks for answer kindly. @geisshirt,非常感谢你的回答。

I had a idea from his answer, and below is result. 我从他的答案中得到了一个想法,下面是结果。

RealmResults<Statement> statements = realm.where(Statement.class).findAll();
RealmQuery<Sms> query = realm.where(Sms.class).equalTo("address", "123456789");
for(Statement statement : statements){
    query = query.notEqualTo("id", statement.getSmsId());
}
RealmResults<Sms> smsList = query.findAll();

I think this will achieve my goal, but I'm doubtful about this is the only way to achieve not in or in statement. 我认为这将实现我的目标,但我怀疑这是实现not inin声明中的唯一方法。

Is there noway to do this more clearly? 现在有没有更清楚地做到这一点?

With your current model, you will have to iterate: 使用您当前的模型,您将不得不迭代:

RealmResults<Statement> statements = realm.where(Statement.class).equalTo("address", "123456789").findAll();
for(Statement statement : statements) {
    RealmResults<Sms> sms = realm.where(Sms.class).notEqualTo("id", statement.smsId).findAll();
    // do something to sms
}

I'm not sure what the query really means: did you mean id in instead of id not in ? 我不确定查询的真正含义:你的意思是id in而不是id not in吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM