【问题标题】:Retrieving data from another class in one query在一个查询中从另一个类中检索数据
【发布时间】:2015-03-24 00:30:59
【问题描述】:

我构建了一个使用Parse 的应用程序。我的应用程序允许用户注册、登录然后发布到解析云数据库。
我有两个 Parse 类,一个叫做 User,一个叫做 Posts用户ObjectId用户名组成密码帖子ObjectId文本组成用户。其中 user 是指向 User 类中的 ObjectId 的指针。

我在我的应用程序中创建了一个名为 getData() 的方法,其中包含一个 ParseQuery,它查询 Posts 类,选择 text 字段并包括 user 字段。然后查询将数据检索到 List 中,然后遍历 List 的每一行,从 text 字段中收集字符串,然后将其添加到 UI 上的 ListView每次程序通过循环时使用postList.add(textList.get(i).getString("text"));
循环内是另一个查询,它查询User类,选择objectId 字段,然后我向查询添加一个约束,告诉它只检索 objectId 字段等于 userPosts 类中的 /em> 字段(我认为)。

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

接下来,我想获取查询检索到的收集到的用户名数据,将其放入一个字符串中,然后在屏幕上显示出来。所以基本上getData() 方法应该收集来自 text 字段和 username 的所有字符串发布它的用户。

问题是我不确定我是否正在尝试以正确的方式解决这个问题。我的应用程序在执行这段代码时抛出错误,所以我显然做错了什么。

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();
            }

        }
    });
}


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

【问题讨论】:

    标签: android database parse-platform pfquery parse-android-sdk


    【解决方案1】:

    如图所示的这个方法没有任何用处:

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。我只想让它做我想做的事,返回所有帖子和属于每个帖子的用户的用户名。我不想将我的问题提出为“我如何使这项工作”,因为我知道这里的人会为此发疯。
    • 如果您在帖子中将user 列设为指向User 的指针,那么您只需使用postQuery.include("user") 即可使用户的所有属性可用。
    • 等我下班回家试试看:)
    • 是的,只要您在 Post 查询中调用 include("user"),就会填充所有用户数据。
    • 正确,您将其添加到查询中并包含该帖子的用户的全部内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2021-06-12
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多