检索ParseUser中的自定义字段

问题描述:

我试图检索用户第一次创建帐户时添加的“位置”字段。位置字段只是另一个字段,如“用户名”或“电子邮件”。我知道你可以用下面的方式来获得一个字段:检索ParseUser中的自定义字段

ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore"); 
query.whereEqualTo("playerEmail", "[email protected]"); 
query.getFirstInBackground(new GetCallback<ParseObject>() { 
    public void done(ParseObject object, ParseException e) { 
    if (object == null) { 
     Log.d("score", "The getFirst request failed."); 
    } else { 
     Log.d("score", "Retrieved the object."); 
    } 
    } 
}); 

与上述方法的问题是,我不知道该位置将是什么,因为它是为每个用户不同的,有50个不同的位置,所以我不能使用whereEqualTo方法。我只需要ParseUsers的位置字段中的信息,然后就可以将它显示在吐司或列表视图中。

UPDATE:

这是我的ListView和适配器在onResume方法:

mCurrentUser = ParseUser.getCurrentUser(); 
    mFriendsRelation = mCurrentUser 
      .getRelation(ParseConstants.KEY_FRIENDS_RELATION); 
    ParseQuery<ParseUser> query = mFriendsRelation.getQuery(); 
    query.addAscendingOrder(ParseConstants.KEY_USERNAME); 

    query.findInBackground(new FindCallback<ParseUser>() { 

     @Override 
     public void done(List<ParseUser> friends, ParseException e) { 
      setProgressBarIndeterminateVisibility(false); 
      if (e == null) { 
       mFriends = friends; 
       String[] usernames = new String[mFriends.size()]; 
       int i = 0; 
       for (ParseUser user : mFriends) { 
        usernames[i] = user.getUsername(); 
        i++; 
       } 

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(
         getListView().getContext(), 
         android.R.layout.simple_list_item_1, usernames); 
       setListAdapter(adapter); 
      } else { 
       // log error 
       // left out to cut out code length 
      } 
     } 
    }); 

这里是我的尝试:final Object o = getListView().getItemAtPosition(position); //String user = (String) o; ParseUser user = (ParseUser) o; String loc = (String) user.get("location"); Toast.makeText(Friends.this,"Location is " + loc, Toast.LENGTH_LONG).show();

并且得到错误cannot be cast to com.parse.ParseUser为线ParseUser user = (ParseUser) o;

+1

如果您只想拥有设备的用户的位置,您可以执行'ParseUser.getCurrentUser()。getString(“location”)''。否则,你可以尝试解释更多关于你想要做什么的吗? – cYrixmorten 2014-10-19 01:30:29

+1

'whereEqualTo'不用于获取字段。这是你的查询的一个约束。例如在你的情况下,它的意思是“给我的用户发电子邮件[email protected]”。它返回这些用户的所有字段,然后你可以访问你想要的字段'object.getString(“location”);'此外,你还可以限制查询返回选定的字段'query.selectKeys(Arrays.asList “playerEmail”,“location”));' – knshn 2014-10-19 07:31:43

+0

@cYrixmorten no我不想让用户拥有该设备,我试图让该用户的朋友显示该朋友的位置字段。 @knshn我在我的'onListItemClick'方法中尝试了以下内容。请在操作中查看我所尝试的内容。 – 2014-10-19 19:19:24

有很多选择,大多数是指你的onListItemClick功能: 包含用户名作为字符串(因为这是你正在使用建立)来找到你需要的用户细节(作为新的查询),引用属于该用户的位置(String[] locations = new String[mFriends.size()];),或建立你的数组/显示你的(用户名位置)

引用该位置将是首选,因为它避免了另一个查询。

使用第二个查询获取有关点击详细信息 - 请确保您的用户名是独一无二的,使用原来的“获取一个字段”查询您发布 - 看到 https://parse.com/docs/js/guide#users-queryinghttps://parse.com/docs/js/api/classes/Parse.Query.html

还看到:https://parse.com/questions/android-how-to-access-fields-when-using-findinbackground

private void findUserLocation(String username) { 
    ParseQuery<ParseUser> query = ParseQuery.getQuery(); 
    query.whereEqualTo("username", username); 
    ... 
    query.findInBackground(new FindCallback<ParseUser>() { 

      @Override 
      public void done(List<ParseUser> users, ParseException e) { 
      ... 
      //stores locations for all users that match the username 
      String[] locations = new String[users.size()]; 
      for (ParseUser user : users) { 
       locations[i] = user.getString("location"); 
       i++; 
      } 
      ... 

引用位置时 - 您可以将它存储在原始for循环中,例如: locations[i] = user.get("location");,然后检索它在你的点击功能String loc = locations[position];

在任何情况下,你要检查,如果存储和当location字段定义/非空/或显示它之前(取决于您的应用程序)