领域Android嵌套查询

时间:2016-02-08 18:20:16

标签: android realm

鉴于以下类别和关系,我需要一个 RealmResults< Model1> 满足以下要求:

型号1

int id
RealmList<Model2>

模型2

int id
int model1Fk
int type
RealmList<Model3>

Model3

int model2Fk

我想查询所有Model1实体,对于特定的Model2相关实例类型,Model2实例至少有一个与Model3相关的实例。

在SQL中(尚未测试):

select distinct model1.*
from Model1 model1 join Model2 model2 on model2.model1Fk = model1.id join Model3 model3 on model3.model2Fk = model2.id
where model2.type = 'Some Type'

2 个答案:

答案 0 :(得分:0)

这些模型是存储在Android中的SQLite数据库中还是纯Java对象?

如果它们是本机对象,那么您可以直接引用它们。 例如

class Model1 {
   int id;
   RealmList<Model2> list;
}
class Model2 {
   int id;
   int type;
   Model1 parent;

}

您甚至可以构建一个可以为您完成所有这些操作的哈希映射。根据Android中这些对象的存在方式,可以制定策略。

答案 1 :(得分:0)

您的文字说明和加入不符合,但如果您希望查找Model1 Model2 Some type的所有realm.where(Model1.class).equalTo("model2List.type", "Some Type").findAll(); ,则可以执行以下操作:

Model1

您可以在此处阅读有关链接查询的信息:https://realm.io/docs/java/latest/#link-queries

如果您要查找至少有一个Model2并且至少有一个Model3具有某个值的所有realm.where(Model1.class).equalTo("model2List.Model3List.model2Fk", "some model2Fk value").findAll(); ,您可以执行以下操作:

public EventListStatus eventListParser(String response) {
    String msg = null;
    String status = null;
    EventListStatus eventListStatus = new EventListStatus();
    ArrayList<EventList> eventLists = new ArrayList<EventList>();
    eventLists.clear();
    try {
        JSONObject jo = new JSONObject(response);
        status = jo.getString("status");
        msg = jo.getString("msg");
        eventListStatus.setErrorCode(jo.getString("errorCode"));
        eventListStatus.setErroDesc(jo.getString("errorDesc"));
        eventListStatus.setMsg(msg);
        eventListStatus.setMsg(status);
        if(msg != null && msg.equalsIgnoreCase("success"))
        {
            JSONArray ja = new JSONArray(jo.getString("data"));
            for(int j=0;j<ja.length();j++){
                JSONObject jo1 = new JSONObject(ja.getString(j));
                EventList el = new EventList();
                el.setID(jo1.getString("ID"));
                el.setPost_title(jo1.getString("post_title"));
                el.setPost_date(jo1.getString("post_date"));
                el.setDescription(jo1.getString("description"));
                el.setPost_content(jo1.getString("post_content"));
                el.setGuid(jo1.getString("guid"));
                el.setStart_date(jo1.getString("start_date"));
                el.setEnd_date(jo1.getString("end_date"));
                el.setLocation(jo1.getString("location"));
                el.setGeo_location(jo1.getString("geo_location"));
                el.setLatitude(jo1.getString("latitude"));
                el.setLongitude(jo1.getString("longitude"));
                el.setPhone(jo1.getString("phone"));
                el.setStime(jo1.getString("stime"));
                el.setEtime(jo1.getString("etime"));
                el.setVenue(jo1.getString("venue"));
                eventLists.add(el);
            }
            eventListStatus.setEventLists(eventLists);
        }
    } catch (JSONException e) {

        e.printStackTrace();
    }
    return eventListStatus;
}