我的 query.findInBackground 没有在 android 中执行

my query.findInBackground not getting executed in android

我在 android 应用程序中对我的数据使用解析。由于某种原因,query.findInBackground 中的代码没有被执行。

public List<Date> sessionHeaderFetch(){
        Log.d("test", "session fetch entry");
        ParseQuery<Sessions> query = ParseQuery.getQuery(Sessions.class);
        final List<Date> sessionHeaders = null;
        query.findInBackground(new FindCallback<Sessions>() {
            @Override
            public void done(List<Sessions> sessionsObjects, com.parse.ParseException e) {
                Log.d("test", "session internal entry");
                if (e == null) {
                    Log.d("test", "Retrieved " + sessionsObjects.size() + " sessions");
                    for (Sessions session : sessionsObjects) {
                        sessionHeaders.add(session.getNetsDate());
                    };
                } else {
                    Log.d("score", "Error: " + e.getMessage());
                }
            }
        });
        Log.d("test", "session last value");
        return sessionHeaders;
    }

public void done() 中的代码并未全部调用。

我认为您还没有理解如何在 Parse 中正确查询。

当您定义解析查询时。 get 查询应包含您尝试查询的 table 的名称。此外,返回的查询通常是 ParseObjects,因此我希望您的回调应该是 new FindCallback()。

我已经调整了下面的解析查询。

    ParseQuery<Sessions> query = ParseQuery.getQuery("ParseTableName");
    final List<Date> sessionHeaders = null;
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> sessionsObjects, com.parse.ParseException e) {
            Log.d("test", "session internal entry");
            if (e == null) {
                // Find succeeded, so do something
            } else {
                Log.d("score", "Error: " + e.getMessage());
            }
        }
    });

显然,您需要将 "ParseTableName" 替换为您尝试在解析中查询的 table 的名称。

我实际上是通过使用 ArrayList 解决了这个问题,List 初始化存在一些问题,而且结果是以异步方式获取的,所以我调用这些函数的函数得到的是空值,所以我不得不通过调用函数来编写也异步调用解析提取函数。

但是查询可以这样写并且有效。

 public void sessionFetch(Date headers, final ParseIOListener<Sessions> listener){
        ParseQuery<Sessions> query = ParseQuery.getQuery(Sessions.class);
        Log.d("test", "input header" + headers );
        query.whereEqualTo("NetsDate",headers);
        final ArrayList<Sessions> sessionsData = new ArrayList<Sessions>();
        query.findInBackground(new FindCallback<Sessions>() {
            @Override
            public void done(List<Sessions> sessionsObjects, com.parse.ParseException e) {
                if (e == null) {
                    for (Sessions session : sessionsObjects) {
                        Log.d("test", "output objects" + session.toString() );
                        sessionsData.add(session);
                        Log.d("test", "Retrieved -- sessions" + sessionsObjects.size() );
                    }

                    listener.onDataRetrieved(sessionsData);
                } else {
                    listener.onDataRetrieveFail(e);
                }
            }
        });
    }

如果您想了解有关实现此功能的更多详细信息,

您感觉代码未被调用的原因是因为您在“.findInBackground”操作完成之前return从该方法中退出。请记住,查询是在后台线程上执行的。所以这就是你的代码 运行:

  1. ParseQuery 查询=ParseQuery.getQuery(Sessions.class);
  2. final List sessionHeaders = null;
    ------> 1. query.findInBackground(弹出到后台线程)
  3. return sessionHeaders;(当你到达此处时,sessionHeaders 可能仍为空)。

因此更改代码逻辑并等待回调 return 秒,然后再对 "sessionHeaders" 对象进行任何处理。