Запрос Realm, который также фильтрует данные пользовательских объектов, вложенных в другой класс RealmObject

#java #android #realm

#java #Android #realm

Вопрос:

Я пытаюсь создать запрос в Realm, который отфильтровывает данные пользовательских объектов, которые сами по себе находятся внутри класса RealmObject. Так, например:

У меня есть этот класс

 public class Email extends RealmObject {

public static final String PROPERTY_SUBJECT = "subject";
public static final String PROPERTY_SENDER = "sender";
public static final String PROPERTY_BODY = "body";

  public String subject;
  public Sender sender;
  public Body body;
  public Date receivedDateTime;
}

public class Sender extends RealmObject {
  public EmailAddress emailAddress;
}

public class EmailAddress extends RealmObject {
  public String emailId;
  public String name;
}

public class Body extends RealmObject {
  public String content;
  public String contentType;
}
  

Итак, я пытаюсь создать запрос, который возвращает мне все результаты, основанные на пользовательском поиске, для фильтрации по «теме, адресу электронной почты, имени, bodyContent».

Итак, я пытаюсь сделать это так

 Realm realm = Realm.getDefaultInstance();
RealmQuery<Email> query = realm.where(Email.class);

query.beginGroup();
query.contains(Email.PROPERTY_SUBJECT, queryString);
query.contains(Email.PROPERTY_SENDER, ?);
query.contains(Email.PROPERTY_BODY, ?);
query.endGroup();

RealmResults<Email> results = query.findAllSorted(Email.PROPERTY_RECEIVED_DATE_TIME, Sort.DESCENDING);
  

Я пытаюсь понять, как я могу поместить объект Sender и Body в запрос, поскольку они являются пользовательскими объектами.

Кто-нибудь может мне помочь, поскольку я новичок в Realm?

Заранее благодарю вас .. 🙂

Комментарии:

1. Я бы подумал о том, чтобы просто поместить все эти RealmObjects в один RealmObject (как класс). Таким образом, вам не придется вручную управлять каскадными удалениями.

Ответ №1:

Я понял, что я делал неправильно в своем запросе Realm. По сути, я не использовал оператор or() для объединения нескольких запросов, и именно по этой причине я не смог получить желаемые результаты.

Теперь я решил эту проблему самостоятельно. Вот мое решение:

     RealmQuery<Email> query = realm.where(Email.class);
    query.contains(Email.PROPERTY_SUBJECT, queryString, Case.INSENSITIVE).or()
        .contains(Email.PROPERTY_SENDER_NAME, queryString, Case.INSENSITIVE).or()
        .contains(Email.PROPERTY_SENDER_EMAIL, queryString, Case.INSENSITIVE).or()
        .contains(Email.PROPERTY_BODY_CONTENT, queryString, Case.INSENSITIVE);
    RealmResults<Email> searchResults = query.findAllSorted(Email.PROPERTY_RECEIVED_DATE_TIME, Sort.DESCENDING);
  

Где мои константы примерно такие:

   public static final String PROPERTY_SUBJECT = "subject";
  public static final String PROPERTY_SENDER_NAME = "sender.emailAddress.name";
  public static final String PROPERTY_SENDER_EMAIL = "sender.emailAddress.address";
  public static final String PROPERTY_BODY_CONTENT = "body.content";
  

Кроме того, вы можете видеть в запросе, что я добавил Case.INSENSITIVE параметр, поскольку я хотел, чтобы мой поиск не учитывал регистр.

Спасибо, что дали мне предложения выше и попытались помочь мне. 🙂 🙂

Ответ №2:

Вы можете взглянуть на документ о запросах ссылок.

во-первых beginGroup() , and endGroup , похоже, не требуется для вашего запроса.

попробуйте ниже:

 Realm realm = Realm.getDefaultInstance();
RealmQuery<Email> query = realm.where(Email.class);

query.contains(Email.PROPERTY_SUBJECT, queryString);
query.contains("sender.emailAddress.name", "john");
query.contains("body.content", "some thing");

RealmResults<Email> results = query.findAllSorted(Email.PROPERTY_RECEIVED_DATE_TIME, Sort.DESCENDING);
  

Ответ №3:

Ответ — «запросы ссылок», хотя в вашем случае вы просто должны объединить объекты в один.

 public class Email extends RealmObject {
  private String subject;
  private String senderName;
  private String bodyContent;
  private String bodyContentType;
  private Date receivedDateTime;

  // getters, setters
}