Parse.com - 在for循环

时间:2015-11-16 11:44:44

标签: android json parse-platform

我不知道如何构建问题标题,但是,这就是我想要做的事情。

使用Parse.com

我有一个表--Surveys,它有一个Array数据类型的列。我在此列中存储了JSONArray。 JSONArray有3个JSONObjects。我必须遍历3个JSONObjects,获取一个带有键“type”的字段并使用该键的值(例如“type_dob”)来再次查询单独的表。我需要连续完成此操作,例如,一旦检索到第一个键的结果,我就必须执行第二个键的查询。

我怎样才能实现这个目标?

示例JSON:Questions: [{"type":"type_dob","id":"I27y16N5gX"},{"type":"type_text","id":"jGAujtNNZc"},{"type":"type_radio","id":"cCDlrrJYKI"}]

我现在的代码:

public void getDataFromServer() {

    ParseUser user = ParseUser.getCurrentUser();

    if (user != null) {

        showProgressDialog("Getting Survey details...");

        int survey_count = user.getInt(Const.Parse_User.SURVEY_COUNT);
        Log.d(Const.DEBUG, "Survey Count: " + survey_count);

        String current_survey = "survey_" + (survey_count + 1);
        Log.d(Const.DEBUG, "Current Survey: " + current_survey);


        ParseQuery<ParseObject> query = ParseQuery.getQuery("Surveys");
        query.whereEqualTo(Const.Parse_SURVEYS.SURVEY_ID, current_survey);
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> list, ParseException e) {

                dismissProgressDialog();

                if (e != null) {
                    Log.d(Const.DEBUG, "Exception while getting data from Parse - Surveys table");
                } else {

                    if (list.size() > 0) {

                        ParseObject object = list.get(0);

                        try {

                            String questions_array = object.getJSONArray(Const.Parse_SURVEYS.QUESTIONS).toString();
                            Log.d(Const.DEBUG, "Questions: " + questions_array);

                            JSONArray array = object.getJSONArray(Const.Parse_SURVEYS.QUESTIONS);

                            for (int i = 0; i < array.length(); i++) {

                                JSONObject jsonObject = array.getJSONObject(i);

                                String type = jsonObject.get("type").toString();

//I should write the query for getting data from table matching the String type. //If i do a findInBackground query for each of the key, then its done in a background thread 
//and the for loop exists even before the result for first key comes back. 
//How can i handle this?

                            }


                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }

                    }
                }
            }
        });
    }
}

如果您还需要其他信息,请告诉我?

2 个答案:

答案 0 :(得分:0)

我认为你的数据库设计正朝着一个不幸的方向发展。

据我所知,对你来说更好的方法是存储一个指针数组。例如,在Parse.com中有一个名为“Question”的数据类,它存储了一个类型以及你需要的任何其他属性。

现在假设你的“调查”课程中有一个数组。然后你的代码变得相当简单:

   ParseQuery<ParseObject> query = ParseQuery.getQuery("Surveys");
   query.whereEqualTo(Const.Parse_SURVEYS.SURVEY_ID, current_survey);
   query.include(Const.Parse_SURVEYS.QUESTIONS); // <- IMPORTANT
   query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> list, ParseException e) {
            ParseObject object = list.get(0);
            // get all Question objects
            List<ParseObject> array = object.getList(Const.Parse_SURVEYS.QUESTIONS);
            // no need to fetch, the data is here
            for (ParseObject question: array) {
                String type = question.getString("type");
                String question = question.getString("question");
                List<String> answerOptions = question.getList("options")
                ...
            }
        }
   }

如果出于某种原因你不能过渡到这个设计,那么我相信你想要研究一下Bolts https://github.com/BoltsFramework/Bolts-Android。有了这个,你就可以获得与Promises在javascript中相同的异步能力。这意味着您可以排列一系列后台作业,并仅在完成所有后续作业时返回。

虽然Bolts会帮助你,但它不会避免在完成之前退出你的for循环。然而,这仅仅是设计问题,这意味着只要您了解我们程序的流程,您就可以相应地进行设计。例如,在所有后台任务完成(或失败)之前推迟解除进度对话框。

但我建议您查看有关query.include()功能以及指针数组的文档。

答案 1 :(得分:0)

我从数据解析表中以这种方式获取数据。

 ParseQuery<ParseObject> query = ParseQuery.getQuery("Surveys");
           query.whereEqualTo(Const.Parse_SURVEYS.SURVEY_ID, current_survey);
           query.include(Const.Parse_SURVEYS.QUESTIONS); // <- IMPORTANT
           query.findInBackground(new FindCallback<ParseObject>() {
                @Override
                public void done(List<ParseObject> list, ParseException e) {
                    ParseObject object = list.get(0);
                    // first initilization Jsonobject Array list.
                    List<JSONObject> jsobj = new ArrayList<JSONObject>();

                    jsobj  = object.getList(Const.Parse_SURVEYS.QUESTIONS);
                    // no need to fetch, the data is here
                    for (int i = 0; i < jsobj.size(); i++) {
                        Log.e("in the For loop ", ": : ::111111 : " +      jsobj.get(i));
                        JSONObject arr1 = new JSONObject((Map)      jsobj.get(i)); // jsobj.get(i);
                        Log.e("in the For loop ", ": : ::111111 : " + arr1);
                        try {
                            Log.e("in the For loop ",
                                    ": : ::111111 : " +      arr1.getString("name"));
 //                             hear u want to store data in Custom Array      list.
 //                             other wise u store in single String value
                            String type = arr1.getString("type");
                            String question = arr1.getString("question");
                            String options = arr1.getString("options");
 //                             this is my custom getter setter class
                            GetIngredients ai = new GetIngredients();
                            ai.setName(arr1.getString("type"));
                            ai.setQty(arr1.getString("question"));
                            ai.setUnit(arr1.getString("options"))     ;
 //                             this is my custom array
                            arr_Ingredients.add(ai);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        Log.e("in the For loop ", ": : :: : " +      jsobj.get(i));
                    }
           }
在我的解析数据库列类型中的

是&#34;数组&#34;。