来自本地数据存储的Parse.com脱机查询返回0个对象

时间:2019-05-22 09:56:49

标签: android kotlin parse-platform

我正在使用使用Parse的Android应用程序,并且应该可以离线工作。

每次应用在启动屏幕中启动时,它将以递归方式运行以从数据库中获取每个单个类对象数据。如果用户在线,它将获取近200个对象到本地数据存储(从简单对象到具有关系的对象以及指向这些简单对象的指针)。

在离线模式下,它应该从本地数据存储中加载这些对象,并且应与在线版本相同。

问题是它不会加载某些对象,我必须检查ParseUser.objectId是否等于要查找的对象中指向用户的指针。如果您离线,则无法使用。返回了0个对象。如果您在线,则按预期运行。

我已经检查了ParseUser.objectIdACL。他们是完全一样的。联机和脱机用户都是同一用户(不是匿名用户)。

解析API调用:

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 :(得分:0)

您能不能尝试将此处的行更改为此?

q.whereEqualTo(USER_ID, user)