我正在使用使用Parse的Android应用程序,并且应该可以离线工作。
每次应用在启动屏幕中启动时,它将以递归方式运行以从数据库中获取每个单个类对象数据。如果用户在线,它将获取近200个对象到本地数据存储(从简单对象到具有关系的对象以及指向这些简单对象的指针)。
在离线模式下,它应该从本地数据存储中加载这些对象,并且应与在线版本相同。
问题是它不会加载某些对象,我必须检查ParseUser.objectId
是否等于要查找的对象中指向用户的指针。如果您离线,则无法使用。返回了0个对象。如果您在线,则按预期运行。
我已经检查了ParseUser.objectId
和ACL
。他们是完全一样的。联机和脱机用户都是同一用户(不是匿名用户)。
解析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)
}
}
答案 0 :(得分:0)
您能不能尝试将此处的行更改为此?
q.whereEqualTo(USER_ID, user)