2

我已经构建了一个使用Parse的应用程序。我的应用程序允许用户注册、登录然后发布到解析云数据库。
我有两个 Parse 类,一个叫做User,一个叫做PostsUserObjectIdusernamepassword组成,PostsObjectIdtextuser组成。其中user是指向User类中的ObjectId的指针。 我在我的应用程序中创建了一个包含 ParseQuery 的方法,它查询

getData()Posts类,选择文本字段并包含用户字段。然后查询将数据检索到一个列表中,然后循环遍历列表的每一行,从文本postList.add(textList.get(i).getString("text"));字段中收集字符串,然后使用程序每次循环时将其添加到 UI 上的 ListView 中。
在循环中是另一个查询,它查询User类,选择objectId字段,然后我向查询添加一个约束,告诉它只检索objectId字段等于Posts类中的user字段的数据(我认为)。

ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
                        queryUser.selectKeys(Arrays.asList("objectId"));
                        queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));

接下来,我想获取查询检索到的收集到的用户名数据,将其放入一个字符串中,然后在屏幕上显示它。所以基本上该方法应该从文本字段和发布它的用户的用户getData()中收集所有字符串。问题是我不确定我是否试图以正确的方式解决这个问题。执行这段代码时,我的应用程序会引发错误,所以我显然做错了什么。


java.lang.IllegalStateException: ParseObject has no data for this key.  Call fetchIfNeeded() to get the data.
            at com.parse.ParseObject.checkGetAccess(ParseObject.java:3235)
            at com.parse.ParseObject.getString(ParseObject.java:2817)
            at com.text.parse.MainActivity$3.done(MainActivity.java:186)

第 186 行的代码:queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));

我的问题是:
1. 我是否试图以正确的方式做到这一点?
2. 为什么我会收到这个错误?

方法代码getData()

public void getData() {

        final ArrayList<String> postList = new ArrayList<String>();
        final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.listview_row, postList);


        final ParseQuery<ParseObject> queryPosts = ParseQuery.getQuery("Posts");
        queryPosts.selectKeys(Arrays.asList("text"));
        queryPosts.include("user");
        queryPosts.addDescendingOrder("createdAt");
        queryPosts.setLimit(20);

        queryPosts.findInBackground(new FindCallback<ParseObject>() {

            @Override
            public void done(List<ParseObject> textList, ParseException e) {

                if (e == null) {
                    //query successful

                    for (int i = 0; i < textList.size(); i++) {

                        postList.add(textList.get(i).getString("text"));

                        ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
                        queryUser.selectKeys(Arrays.asList("objectId"));
                        queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
                        queryUser.setLimit(20);

                        queryUser.findInBackground(new FindCallback<ParseObject>() {
                            @Override
                            public void done(List<ParseObject> userList, ParseException e) {

                                if (e == null) {

                                    String s = userList.get(0).getString("username").toString();

                                    Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
                                }

                                else {
                                    //query error

                                    Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
                                }
                            }
                        });
                    }

                    lvText.setAdapter(listAdapter);

                } else {
                    //query error

                    Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
                }

            }
        });
    }



对不起,很长的问题。任何帮助将不胜感激,谢谢。


更新:
对于遇到类似问题的任何人,这是我如何让它工作的:

public void getData() {

    final ArrayList<String> postList = new ArrayList<String>();
    final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.listview_row, postList);


    final ParseQuery<ParseObject> queryPosts = ParseQuery.getQuery("Posts");
    queryPosts.include("user");
    queryPosts.addDescendingOrder("createdAt");
    queryPosts.setLimit(20);

    queryPosts.findInBackground(new FindCallback<ParseObject>() {

        @Override
        public void done(List<ParseObject> textList, ParseException e) {

            if (e == null) {
                //query successful

                for (int i = 0; i < textList.size(); i++) {

                    postList.add(textList.get(i).getString("text"));


                    ParseObject po1 = textList.get(i);
                    ParseObject po2 = po1.getParseObject("user");
                    String username = po2.getString("username");

                    Toast.makeText(MainActivity.this, username, Toast.LENGTH_SHORT).show();
                }

                lvText.setAdapter(listAdapter);

            } else {
                //query error

                Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
            }

        }
    });
}


您只需在要查询的类中包含指向另一个类的指针的列,然后您就可以访问第二个类中的所有数据列。

4

1 回答 1

0

如图所示,此方法没有任何用处:

ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));

selectKeys语句告诉它只返回列的内容,您将其作为参数objectId传递给语句......运行查询以获取您已经拥有的值似乎很愚蠢!?。在您认为需要优化查询之前,whereEqualTo我不会使用。selectKeys此查询的唯一用途是让您知道 是否有效,因为如果它对 a 无效,objectId查询将返回。nullobjectIdUser

我希望您想获得有关用户的更多信息,因此如果您删除selectKeys,则将返回其他列。

fetchIfNeeded由于这一行而引发异常的事实:

queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));

这表明textList.get(i).getString("user")没有为用户返回一个objectId。如果这不是username按照您的其他一些评论的建议返回 a (此处不确定),那么您需要将该行代码更改为:

queryUser.whereEqualTo("username", textList.get(i).getString("user"));

如果您还有其他问题,您的问题需要更加精确,因为目前还不清楚您要问什么。

于 2015-03-24T07:14:30.477 回答