我正在使用parse.com的Android SDK,并且遇到了一个特殊的问题。
来自片段的onCreate:
以下是onCreate的代码片段:
ParseObject myChatGroup = ParseObject.createWithoutData("ChatGroup", "mOJGWRiLPC");
myChatGroup.fetchInBackground(new GetCallback<ParseObject>() {
@Override
public void done(ParseObject chatGroup1, ParseException e) {
if (e == null) {
l.d("Fetched chat group: " + chatGroup1 + " from server");
chatGroup1.pinInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
l.d("Successfully pinned chat group");
ParseQuery<ParseObject> chatGroupParseQuery = new ParseQuery<>("ChatGroup");
chatGroupParseQuery.fromLocalDatastore()
.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> list, ParseException e) {
if (e == null) {
l.d("Found " + list.size() + " chat groups from local datastore");
} else {
e.printStackTrace();
}
}
});
} else {
e.printStackTrace();
}
}
});
} else {
e.printStackTrace();
}
}
});
这是日志:
Fetched chat group: ChatGroup { objectId: mOJGWRiLPC, name: Admin } from server
Successfully pinned chat group
Found 0 chat groups from local datastore
但这没有任何意义!我只是固定了一个对象,所以如何在本地数据存储区中有0个对象。代码很简单。 我做错了什么?这可能是SDK的错误吗?
我将非常感谢任何见解,我一直试图找到这个问题几天。
Parse设置对我来说很好看:
ParseObject.registerSubclass(ChatGroup.class);
Parse.enableLocalDatastore(this);
Parse.initialize(this, AppProps.properties.appId,
AppProps.properties.clientKey);
ParseUser.enableRevocableSessionInBackground();
Parse.setLogLevel(Parse.LOG_LEVEL_DEBUG);
注意:
Message
之类的其他类也让我怀疑我的ChatGroup类出了什么问题。ChatGroup
类中添加了两个字段:name(字符串)和消息(Relation),对一个名为Admin的角色具有读写权限。ParseObjects
)确实包含我固定的行。但不知何故解析显示0查询结果!答案 0 :(得分:2)
Parse似乎不支持本地数据存储上的ACL。所以解决这个问题的最简单方法是对查询执行ignoreACLs() - 假设你确实在服务器端正确设置了角色/ acls,所以无论你在本地固定什么,都应该已经允许了。
答案 1 :(得分:1)
我发现了这个问题。它似乎更像是解析Android SDK的错误。我将其缩小到使用Android SDK检索带有特殊ACL的固定对象的问题。
最初,对象具有ACL,只有“Admin”(我创建的)角色才能读写。有趣的是,我正在测试固定和查询的用户是“管理员”!但是,当我更改ACL以便公众可以阅读但只有管理员可以写,问题就解决了!
我的理论是查询本地数据存储区的行为就像一个公共查询,无论用户进行查询的角色是什么!但是,如果任何其他理论解释这一点将不胜感激。幸运的是,在我的情况下,我需要公共读取访问权限,但对于需要具有限制ACL的读访问权限的人来说,这个错误可能是一个巨大的挫折!希望parse.com能尽快解决这个问题 这是一个很大的问题!我很惊讶我找不到关于这个问题的问题。
答案 2 :(得分:1)
是的,所以基本上你必须为当前用户设置ACL并在固定聊天组之前固定它。
ParseACL acl = new ParseACL();
acl.setReadAccess(ParseUser.getCurrentUser(), true);
ParseUser.getCurrentUser().setACL(acl);
ParseUser.getCurrentUser().pinInBackground();