解析本地数据存储查询

Parse Local Datastore Query

我正在尝试在我的 Android 应用程序中启用缓存结果,该应用程序使用 Back4App 的 Parse Server 作为后端。

我启用了本地数据存储,但我似乎无法从网络/缓存结果中查询。

以下代码来自我的查询

        query.fromLocalDatastore().findInBackground()
                .continueWithTask((task) -> {
                    if (task.isFaulted() && task.getError() instanceof ParseException && ((ParseException) task.getError()).getCode() == ParseException.CACHE_MISS) {
                        return query.fromNetwork().findInBackground();
                    }
                    Log.d("Cache", "" + task.getResult().size());
                    return task;
                }, Task.UI_THREAD_EXECUTOR)
                .continueWithTask((task) -> {
                    // Update UI with results ...
                    Log.d("Network", "" + task.getResult().size());
                    ParseObject.pinAllInBackground(task.getResult());
                    return task;
                }, Task.UI_THREAD_EXECUTOR);

logcat 显示大小为 0 的缓存和网络。

我尝试了以下方法:

        query.fromLocalDatastore().findInBackground()
                .continueWithTask((task) -> {
                    // Update UI with results from Local Datastore ...
                    ParseException error = (ParseException) task.getError();
                    if (error == null) {
                        Log.d("Cache", "" + task.getResult().size());
                    }
                    // Now query the network:
                    return query.fromNetwork().findInBackground();
                }, Task.UI_THREAD_EXECUTOR)
                .continueWithTask((task) -> {
                    // Update UI with results from Network ...
                    ParseException error = (ParseException) task.getError();
                    if (error == null) {
                        Log.d("Network", "" + task.getResult().size());
                    }
                    return task;
                }, Task.UI_THREAD_EXECUTOR);

它先执行缓存再执行网络,它正在运行。 但是我想要 Cache else Network if error is not null.

您的对象似乎从未被固定,因此您的本地查询总是成功返回 0 个对象,并且它继续没有再次固定任何东西。尝试类似的东西:

            query.fromLocalDatastore().findInBackground()
                .continueWithTask((task) -> {
                    ParseException error = (ParseException) task.getError();
                    if (error != null || task.getResult().size() == 0) {
                        return query.fromNetwork().findInBackground();
                    }
                    Log.d("Cache", "" + task.getResult().size());
                    return task;
                }, Task.UI_THREAD_EXECUTOR)
                .continueWithTask((task) -> {
                    // Update UI with results ...
                    Log.d("Network", "" + task.getResult().size());
                    ParseException error = (ParseException) task.getError();
                    if (error == null) {
                        ParseObject.pinAllInBackground(task.getResult());
                    }
                    return task;
                }, Task.UI_THREAD_EXECUTOR);