使用 ParseQueryAdapter 查询本地数据存储即使在成功固定后也会给出 0 个结果
Querying local datastore in using ParseQueryAdapter gives 0 results even after successfully pinning
背景:
我正在为 Android 开发一个群发消息应用程序,使用 parse.com 作为我的后端。
工作:
我有一个 ParseQueryAdapter,它使用以下方法从本地数据存储中查询 ChatGroups:
public ChatGroupAdapter(final Context context) {
super(context, new ParseQueryAdapter.QueryFactory<ChatGroup>() {
public ParseQuery<ChatGroup> create() {
ParseQuery<ChatGroup> chatGroupQuery = ParseQuery.getQuery(ChatGroup.class);
chatGroupQuery.fromLocalDatastore();
Log.d(ChatGroup.class.getName(), "Constructor query: " +
chatGroupQuery + " made");
//noinspection unchecked
return chatGroupQuery;
}
});
}
包含它的片段通过添加一个ParseQueryAdapter.OnQueryLoadListener
来监听它。如果 ParseQueryAdapter
无法从本地数据存储中检索 ChatGroup
s,它会从解析中检索它,固定它,然后触发 ParseQueryAdapter
以使用以下方法重试从本地数据存储加载:.loadObjects();
.这是我的片段中的代码片段:
@Override
public void onLoaded(List<ChatGroup> groups, Exception e) {
l.d("onLoaded called");
if (e != null) {
e.printStackTrace();
updateLocalDatastore();
} else if (groups == null) {
l.w("Received null group list.");
updateLocalDatastore();
} else if (groups.size() == 0) {
l.w("Received group list of size zero.");
updateLocalDatastore();
} else {
l.d("Chat groups loaded successfully");
}
}
private void updateLocalDatastore() {
final ParseQuery<ChatGroup> groupQuery = ParseQuery.getQuery(ChatGroup.class);
groupQuery.findInBackground(new FindCallback<ChatGroup>() {
@Override
public void done(final List<ChatGroup> chatGroupList, ParseException e) {
if (e != null) {
e.printStackTrace();
} else {
if (chatGroupList != null) {
ParseObject.pinAllInBackground(chatGroupList, new SaveCallback() {
@Override
public void done(ParseException e) {
if (e != null) {
e.printStackTrace();
} else {
l.d("Successfully pinned: " + chatGroupList.size() +
" groups to local datastore. Reloading adapter");
groupAdapter.loadObjects();
}
}
});
} else {
l.e("Received null group list from cloud! " +
"Local datastore update failed!");
}
}
}
});
}
结果:
这是执行的简化日志:
ChatFragment: onCreate
ChatFragment﹕ Initializing chat groups
ChatFragment﹕ Loading chat groups
ChatFragment: onStart
ChatFragment: onResume
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
对我来说很明显 ParseQueryAdapter
应该在第一次触发 updateLocalDatastore()
时检索 0 列表,它从解析中提取 3 ChatGroup
s,固定它们,然后它应该从本地数据存储接收 3。 然而,正如在日志中所见,即使在成功固定它们之后,它仍继续从本地数据存储中找到 0 ChatGroup
s!
项目设置看起来不错:
Parse.enableLocalDatastore(this);
Parse.initialize(this, AppProps.properties.appId, AppProps.properties.clientKey);
ParseUser.enableRevocableSessionInBackground();
Parse.setLogLevel(Parse.LOG_LEVEL_DEBUG);
ParseObject.registerSubclass(ChatGroup.class);
我做错了什么?!我错过了什么吗?
我用 ParseUser
实现了完全相同的逻辑,并且它完美地工作了!用 GroupChat
:
做同样的事情似乎有问题
@ParseClassName("ChatGroup")
public class ChatGroup extends ParseObject {
有人说它是一个解析 与本地数据存储中的关系。但我什至没有使用关系。即使是来自本地数据存储的简单查询也不起作用。
虽然我无法解决问题,但我发现了问题所在。该问题与 Android 的 Parse SDK 的潜在错误有关:
背景:
我正在为 Android 开发一个群发消息应用程序,使用 parse.com 作为我的后端。
工作:
我有一个 ParseQueryAdapter,它使用以下方法从本地数据存储中查询 ChatGroups:
public ChatGroupAdapter(final Context context) { super(context, new ParseQueryAdapter.QueryFactory<ChatGroup>() { public ParseQuery<ChatGroup> create() { ParseQuery<ChatGroup> chatGroupQuery = ParseQuery.getQuery(ChatGroup.class); chatGroupQuery.fromLocalDatastore(); Log.d(ChatGroup.class.getName(), "Constructor query: " + chatGroupQuery + " made"); //noinspection unchecked return chatGroupQuery; } }); }
包含它的片段通过添加一个
ParseQueryAdapter.OnQueryLoadListener
来监听它。如果ParseQueryAdapter
无法从本地数据存储中检索ChatGroup
s,它会从解析中检索它,固定它,然后触发ParseQueryAdapter
以使用以下方法重试从本地数据存储加载:.loadObjects();
.这是我的片段中的代码片段:@Override public void onLoaded(List<ChatGroup> groups, Exception e) { l.d("onLoaded called"); if (e != null) { e.printStackTrace(); updateLocalDatastore(); } else if (groups == null) { l.w("Received null group list."); updateLocalDatastore(); } else if (groups.size() == 0) { l.w("Received group list of size zero."); updateLocalDatastore(); } else { l.d("Chat groups loaded successfully"); } } private void updateLocalDatastore() { final ParseQuery<ChatGroup> groupQuery = ParseQuery.getQuery(ChatGroup.class); groupQuery.findInBackground(new FindCallback<ChatGroup>() { @Override public void done(final List<ChatGroup> chatGroupList, ParseException e) { if (e != null) { e.printStackTrace(); } else { if (chatGroupList != null) { ParseObject.pinAllInBackground(chatGroupList, new SaveCallback() { @Override public void done(ParseException e) { if (e != null) { e.printStackTrace(); } else { l.d("Successfully pinned: " + chatGroupList.size() + " groups to local datastore. Reloading adapter"); groupAdapter.loadObjects(); } } }); } else { l.e("Received null group list from cloud! " + "Local datastore update failed!"); } } } }); }
结果:
这是执行的简化日志:
ChatFragment: onCreate
ChatFragment﹕ Initializing chat groups
ChatFragment﹕ Loading chat groups
ChatFragment: onStart
ChatFragment: onResume
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
对我来说很明显 ParseQueryAdapter
应该在第一次触发 updateLocalDatastore()
时检索 0 列表,它从解析中提取 3 ChatGroup
s,固定它们,然后它应该从本地数据存储接收 3。 然而,正如在日志中所见,即使在成功固定它们之后,它仍继续从本地数据存储中找到 0 ChatGroup
s!
项目设置看起来不错:
Parse.enableLocalDatastore(this);
Parse.initialize(this, AppProps.properties.appId, AppProps.properties.clientKey);
ParseUser.enableRevocableSessionInBackground();
Parse.setLogLevel(Parse.LOG_LEVEL_DEBUG);
ParseObject.registerSubclass(ChatGroup.class);
我做错了什么?!我错过了什么吗?
我用 ParseUser
实现了完全相同的逻辑,并且它完美地工作了!用 GroupChat
:
@ParseClassName("ChatGroup")
public class ChatGroup extends ParseObject {
有人说它是一个解析
虽然我无法解决问题,但我发现了问题所在。该问题与 Android 的 Parse SDK 的潜在错误有关: