Автономный запрос Parse.com из локального хранилища данных возвращает 0 объектов - PullRequest
0 голосов
/ 22 мая 2019

Я работаю над приложением Android, которое использует Parse и должно работать в автономном режиме.

Каждый раз, когда приложение запускается на заставке, оно рекурсивно запускает выборку для извлечения всех данных объекта класса из базы данных. Он будет извлекать почти 200 объектов в локальное хранилище данных (от простых объектов до объектов со связями и указателей на эти простые объекты), если пользователь находится в сети.

В автономном режиме он должен загружать эти объекты из локального хранилища данных и работать так же, как онлайн-версия.

Проблема в том, что он не будет загружать некоторые объекты, где я должен проверить, равен ли ParseUser.objectId указатель на пользователя в объекте (ах), который я хочу найти. Это не работает, если вы не в сети. 0 объектов возвращено. Если вы находитесь в сети, он работает как положено.

Я проверил ParseUser.objectId и ACL с. Они точно такие же. И онлайн, и оффлайн пользователь - это один и тот же пользователь (не аноним).

Parse API Call:

fun getItems(c: Context, itemState: Int, user: ParseUser, isShortcut: Boolean,
                         callback: (List<ParseObject>?, Boolean, ParseException?) -> Unit){

            val q = ParseQuery.getQuery<ParseObject>(ITEM_CLASS)

            q.whereEqualTo(ITEM_STATE, itemState)
            q.include(POINTER_OBJECT)
            q.include(POINTER_OBJECT_ORGANIZATION)

            if (itemState == ITEM_STATE_NEXT){
                q.whereDoesNotExist(ITEM_USER_ID)
                q.whereGreaterThan(NEXT_DATE, getCurrDate())
                q.addAscendingOrder(NEXT_DATE)
                q.whereExists(NEXT_DATE)
            } else {
                if (isOnline(c)){
                    createLog("Reports", "ONLINE:\n" +
                            "UserID: ${user.objectId}\n" +
                            "UserACL: ${user.acl}\n" +
                            "PublicRead: ${user.acl?.publicReadAccess}\n" +
                            "PublicWrite: ${user.acl?.publicWriteAccess}")
                } else {
                    createLog("Reports", "OFFLINE:\n" +
                            "UserID: ${user.objectId}\n" +
                            "UserACL: ${user.acl}\n" +
                            "PublicRead: ${user.acl?.publicReadAccess}\n" +
                            "PublicWrite: ${user.acl?.publicWriteAccess}")
                }
                q.whereEqualTo(USER_ID, user.objectId)
            }

            if (!isOnline(c)) {
                q.ignoreACLs()
                q.fromLocalDatastore()
            }

            q.findInBackground { itemList, err ->
                itemList?.let {reports ->
                    ParseObject.pinAllInBackground(reports)
                    createLog("dataPinned", "${reports.size}")
                }
                callback(itemList, isShortcut, err)
            }
        }

1 Ответ

0 голосов
/ 24 мая 2019

Можете ли вы попробовать изменить эту строку здесь на эту?

q.whereEqualTo(USER_ID, user)
...