在ParseUser中检索自定义字段

时间:2014-10-18 22:15:51

标签: java android parse-platform

我正在尝试检索"位置"我在用户首次创建帐户时添加的字段。位置字段只是另一个字段,如"用户名"或者"电子邮件"。我知道您可以使用以下方式获取一个字段:

ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.whereEqualTo("playerEmail", "dstemkoski@example.com");
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的位置字段的信息,然后就可以在toast或listview中显示它。

更新:

以下是onResume方法中的listview和适配器:

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 个答案:

答案 0 :(得分:1)

有很多选项,大多数都是指您的onListItemClick功能: 将用户名包含为字符串(以及您用来构建的内容)以查找所需的用户详细信息(作为新查询),引用属于该用户的位置(String[] locations = new String[mFriends.size()]; ),或构建您的数组/显示您的列表与两个字段(用户名位置)

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

使用第二个查询获取有关点击的详细信息 - 确保您的用户名是唯一的并使用原始&#34;获取字段&#34;查询你发布 - 请参阅 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字段是否已定义/非空(取决于您的应用程序)