即使在成功固定后从本地数据存储区查询时,ParseQuery 也会给出 0 个对象
ParseQuery gives 0 objects when querying from local datastore even after successfully pinning
我正在使用 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的bug?
任何见解将不胜感激我几天来一直在努力寻找问题。
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);
注:
- 使用 ParseUser 对象尝试相同的逻辑时它工作正常。甚至我的其他 classes,比如我的
Message
,这让我怀疑我的 ChatGroup class. 有问题
- 我在 parse.com 数据浏览器上向我的
ChatGroup
class 添加了两个字段:名称(字符串)和消息(关系),具有对名为的角色的读写权限管理员
- 当浏览到实际的解析数据库(使用 root 访问权限)时,我发现数据库 table (
ParseObjects
) 确实包含我固定的行。但是以某种方式解析在查询时显示 0 个结果!
我发现了问题。它似乎更像是 Android SDK of parse 的一个错误。我将其缩小为使用 Android SDK 检索具有特殊 ACL 的固定对象的问题。
最初,该对象具有 ACL,因此只有角色 'Admin'(我创建的)可以读写。有趣的是,我用来测试固定和查询的用户是 'Admin'!但是,当我将 ACL 更改为 public 可以读取但只有管理员可以写入时,问题就解决了!
我的理论是 查询本地数据存储的行为类似于 public 查询,无论进行查询的用户具有什么角色!但是,如果有任何其他理论可以解释这一点,我们将不胜感激。幸运的是,在我的例子中,我需要 public 读取访问权限,但是对于一些需要读取访问限制 ACL 的人来说,这个错误可能是一个巨大的失败!希望 parse.com 能尽快解决这个问题。
这是一个相当大的问题!我很惊讶我找不到关于这个问题的问题。
是的所以基本上你必须为当前用户设置 ACL 并在固定聊天组之前固定它。
ParseACL acl = new ParseACL();
acl.setReadAccess(ParseUser.getCurrentUser(), true);
ParseUser.getCurrentUser().setACL(acl);
ParseUser.getCurrentUser().pinInBackground();
Parse 似乎不支持本地数据存储上的 ACL。因此,解决此问题的最简单方法是对查询执行 ignoreACLs() - 假设您确实在服务器端正确设置了 roles/acls,因此无论您在本地固定什么,都应该已经获得许可。
我正在使用 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的bug?
任何见解将不胜感激我几天来一直在努力寻找问题。
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);
注:
- 使用 ParseUser 对象尝试相同的逻辑时它工作正常。甚至我的其他 classes,比如我的
Message
,这让我怀疑我的 ChatGroup class. 有问题
- 我在 parse.com 数据浏览器上向我的
ChatGroup
class 添加了两个字段:名称(字符串)和消息(关系),具有对名为的角色的读写权限管理员 - 当浏览到实际的解析数据库(使用 root 访问权限)时,我发现数据库 table (
ParseObjects
) 确实包含我固定的行。但是以某种方式解析在查询时显示 0 个结果!
我发现了问题。它似乎更像是 Android SDK of parse 的一个错误。我将其缩小为使用 Android SDK 检索具有特殊 ACL 的固定对象的问题。
最初,该对象具有 ACL,因此只有角色 'Admin'(我创建的)可以读写。有趣的是,我用来测试固定和查询的用户是 'Admin'!但是,当我将 ACL 更改为 public 可以读取但只有管理员可以写入时,问题就解决了!
我的理论是 查询本地数据存储的行为类似于 public 查询,无论进行查询的用户具有什么角色!但是,如果有任何其他理论可以解释这一点,我们将不胜感激。幸运的是,在我的例子中,我需要 public 读取访问权限,但是对于一些需要读取访问限制 ACL 的人来说,这个错误可能是一个巨大的失败!希望 parse.com 能尽快解决这个问题。
这是一个相当大的问题!我很惊讶我找不到关于这个问题的问题。
是的所以基本上你必须为当前用户设置 ACL 并在固定聊天组之前固定它。
ParseACL acl = new ParseACL();
acl.setReadAccess(ParseUser.getCurrentUser(), true);
ParseUser.getCurrentUser().setACL(acl);
ParseUser.getCurrentUser().pinInBackground();
Parse 似乎不支持本地数据存储上的 ACL。因此,解决此问题的最简单方法是对查询执行 ignoreACLs() - 假设您确实在服务器端正确设置了 roles/acls,因此无论您在本地固定什么,都应该已经获得许可。