解析云;如何编写查询以获取特定列中的所有数据

时间:2015-04-23 08:36:28

标签: android android-studio parse-platform

我为这类问题道歉。我第一次在解析时使用Cloud Code,所以我不知道如何通过Cloud代码解析数据。如果有任何想法,那么建议我。我查了很多例子,但我没有找到我的问题。 我的解析数据库是这样的..

   userId    game1score    game2score  game3score   gender 
   xcvgfs1      300           200           100       man
   sfdgdh       500           600           300       man
像这个解析数据库一样,许多用户正在玩游戏并对游戏进行评分。 我的问题是如何在game1中得到所有用户得分和其他游戏得分,并与当前用户得分进行比较,找到当前用户的等级。 谢谢你的帮助......

在我的活动中调用云代码功能就是这样..

    Map<String, String> map = new HashMap<String, String>();
        map.put(" game1score", "300");

        ParseCloud.callFunctionInBackground("check_duplicate",map,new FunctionCallback<Object>() {
            @Override
            public void done(Object o, ParseException e) {
                if(e==null){
                   Log.e("String",""+o) ;
                }else{
                    Log.e("error",e.getMessage()) ;
                }
            }
        });

返回始终为null或0

1 个答案:

答案 0 :(得分:1)

据我解释,您希望通过使用Parse Score表来提取当前用户的排名,您可以在其中记录3个不同的游戏分数(gameScore1,gameScore2,gameScore3)。您已经编写了Cloud代码触发器功能。所以您可以使用的云代码如下;

Parse.Cloud.define("rank", function(request, status) 
{
  var result = [];
  var processRankCallback = function(res) {
    result = result.concat(res);
    if (res.length === 1000) 
    {
      process(res[res.length-1].id);
      return;
    }
    //All object that is greater than the given user score
    status.success(result.length);
  }
  var processRank = function(skip) 
  {
    var query = new Parse.Query("Score");
    var userScore = request.params.userScore;
    var gameType = request.params.gameType;
    if (skip) query.greaterThan("objectId", skip);
    query.limit(1000);
    query.ascending("objectId");
    query.find().then(function querySuccess(res) 
    {
        var innerResult = [];
        for(var i = 0 ; i < res.length;i++)
        {
            //var gameScore1 = res[i].get("gameScore1");
            //var gameScore2 = res[i].get("gameScore2");
            //var gameScore3 = res[i].get("gameScore3");
            //var total = gameScore1+gameScore2+gameScore3;
            var total = res[i].get(gameType);
            if(userScore < total)  innerResult.push(res[i]);
        }
        processRankCallback(innerResult);
    }, function queryFailed(reason) 
    {
      status.error("Error:" + error.code + "  Message" + error.message);
    });
  }
  processRank(false);
});

实际上,找到排名意味着查询得分表并计算游戏得分总数的条目大于您当前用户的总游戏得分。要实现这一点,您可以使用countQuery,但是当表条目大于1000时,Parse countQuery可能会失败或显示不正确的结果。因此,您可以遍历整个表并找到所有具有较大游戏分数的条目,而不是使用count查询。比你当前的用户。在上面的代码中,我假设你有3个不同的游戏分数,并且都有有效数字(未定义)。您可以出于自己的目的修改代码。最终结果将生成一个数字,实际上是得分表中的条目数,其总游戏得分大于当前用户游戏得分总数。

例如,我有一个分数表,其中包含gameScore1列和3个条目,其中得分为600,200和100.我使用以下参数哈希表调用Cloud函数;

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("userScore", "150");
    params.put("gameType", "gameScore1");
    //Call Parse cloud function

响应将为2,这实际上意味着有两个条目的gameScore1大于150.希望这会有所帮助。 问候。