#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
}