如何一次组合多个解析查询

时间:2015-01-23 11:12:03

标签: android parse-platform

我有两个解析查询,我想在单击一个按钮时进行评估。 我在Parse有两个班。我想一次检查两件事。 我的疑问是:

                ParseQuery<ParseObject> query =ParseQuery.getQuery("Login");
                query.whereEqualTo("x",X);
                query.whereEqualTo("y",Y);

在登录的同时,我正在检查两个实体之间的关系。 我的第二个问题是:

                ParseQuery<ParseObject> query1 =ParseQuery.getQuery("UserData");
                query.whereEqualTo("entity1",entity1);
                query.whereEqualTo("entity2",entity2);

现在,如果两个查询都成功,那么用户就可以处理该应用。 如何组合这两个查询,以便两个查询都必须成功

3 个答案:

答案 0 :(得分:11)

使用复合查询。以下示例取自Parse Docs,网址为www.parse.com

ParseQuery<ParseObject> lotsOfWins = ParseQuery.getQuery("Player");
lotsOfWins.whereGreaterThan(150);

ParseQuery<ParseObject> fewWins = ParseQuery.getQuery("Player");
fewWins.whereLessThan(5);

List<ParseQuery<ParseObject>> queries = new ArrayList<ParseQuery<ParseObject>>();
queries.add(lotsOfWins);
queries.add(fewWins);

ParseQuery<ParseObject> mainQuery = ParseQuery.or(queries);
mainQuery.findInBackground(new FindCallback<ParseObject>() {
  public void done(List<ParseObject> results, ParseException e) {
    // results has the list of players that win a lot or haven't won much.
  }
});

答案 1 :(得分:1)

您可以创建CountDownLatch并使用您的查询数量对其进行初始化。然后每个查询将在完成任务时倒计时。

final CountDownLatch mCountDownLatch = new CountDownLatch(2);
    ParseQuery<ParseObject> query =ParseQuery.getQuery("Login");
    query.whereEqualTo("x",X);
    query.whereEqualTo("y",Y);

    ParseQuery<ParseObject> query1 =ParseQuery.getQuery("UserData");
    query.whereEqualTo("entity1",entity1);
    query.whereEqualTo("entity2",entity2);

    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> parseObjects, ParseException e) {
            if (null == e) {
                mCountDownLatch.countDown();
            }
        }
    });
    query1.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> parseObjects, ParseException e) {
            if (null == e) {
                mCountDownLatch.countDown();
            }
        }
    });
    try {
        mCountDownLatch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        proceedToApp();
    }

您只需创建一个单独的线程,您将从该线程调用await()。

答案 2 :(得分:0)

如果您使用的是JavaScript,我会说“Promises是您的朋友”。

由于您使用的是Java / Android,我建议您查看“Bolts”。

这是来自Parse的博客文章介绍它: http://blog.parse.com/2014/10/15/introducing-bolts-for-parse-sdks/

在您的情况下,onSuccess会触发第二个查询,或者您将saveTasks数组替换为findTasks数组,并保存findInBackground()个操作。