Parse.com搜索(Android) - 直接命中搜索

时间:2015-10-14 18:29:47

标签: java android search parse-platform

我实际构建的是一个EditTextView,它收集一个String,当用户输入时尝试与后端进行通信,以便拉动用户" objectId&#34 ;,这是我的用户数据库中的一列。

下面显示的showProfileActivity()函数很有用,我已将其排除,因为它与问题无关。它需要用户" objectId"并显示用户的个人资料。

我想要的是" String userId",这是用户" objectId"在数据库中动态生成。我知道showProfileActivity()函数有效,因为我可以直接输入一个带有硬编码objectId的String,它会将我带到该用户的配置文件。

我的问题是,根据用户输入搜索字段的字符串,如何检索相关的" objectId"列?

findViewById(R.id.submitSearch).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                EditText searchUserTextField = (EditText) findViewById(R.id.searchUserTextField);

                // Value input to search field
                final String searchInput = searchUserTextField.getText().toString();
                // System.out.println(searchInput);

                // Initiate ParseQuery
                final ParseQuery<ParseUser> query = ParseQuery.getQuery("username");

                // Look for the username that was typed into the search field
                query.whereEqualTo("username", searchInput);

                query.findInBackground(new FindCallback<ParseUser>() {
                    public void done(List<ParseUser> objects, ParseException e) {
                        if (e == null) {
                            // The query was successful.

                            // This works but clearly always loads the exact same user profile. I need this string to be loaded dynamically as a function of the user's search query.
                            String userId = "dj16qsXPle";
                            // System.out.println(userId);

                            showProfileActivity(userId);

                        } else {
                            // Something went wrong.
                        }
                    }
                });

                // Execute RemoteDataTask AsyncTask
                new RemoteDataTask().execute();
            }
        });
    }

2 个答案:

答案 0 :(得分:1)

我不确定showProfileActivity的作用,但是因为你传递了一个userId我假设它做了另一个查询?为什么不这样做:

假设用户名是唯一的(在这种情况下,你似乎也在假设)然后findInBackground方法应该只返回一个用户。

query.findInBackground(new FindCallback<ParseUser>() {
                public void done(List<ParseUser> objects, ParseException e) {
                    if (e == null) {
                        // The query was successful.
                        if(objects.size() > 0){
                            ParseUser user = objects.get(0);
                            showProfileActivity(user);
                        }
                    } else {
                        // Something went wrong.
                    }
                }
            });

在showProfileActivity中,使用用户数据执行showProfileActivity所做的任何操作。

或者,如果您将objectId用于其他内容,则可以执行此操作:

ParseUser user = objects.get(0);
showProfileActivity(user.getObjectId());

这会为您提供您正在寻找的ID,而不是硬编码的ID。再次,在showProfileActivity中执行与objectId相关的任何操作。这可能意味着使用objectId等从单独的表中检索。

答案 1 :(得分:1)

最终弄明白了。我给了你答案,因为你肯定提供了正确解决方案的核心。我的错误在于启动我的ParseQuery: final ParseQuery query = ParseQuery.getQuery(&#34; username&#34;); 。它应该是 ParseQuery query = ParseUser.getQuery();

                // Initiate ParseQuery
                ParseQuery query = ParseUser.getQuery();
                query.whereEqualTo("username", searchInput);
                query.findInBackground(new FindCallback<ParseUser>() {

                    @Override
                    public void done(List<ParseUser> objects, ParseException e) {
                        if (e == null) {
                            // The query was successful.
                            System.out.println(objects);
                            ParseUser user = objects.get(0);
                            String userId = user.getObjectId();
                            showProfileActivity(userId);

                        } else {
                            // Something went wrong. Look at the ParseException to see what's up.
                        }
                    }
                });