【发布时间】:2015-03-24 00:30:59
【问题描述】:
我构建了一个使用Parse 的应用程序。我的应用程序允许用户注册、登录然后发布到解析云数据库。
我有两个 Parse 类,一个叫做 User,一个叫做 Posts。 用户由ObjectId、用户名和组成密码,帖子由ObjectId、文本组成 和 用户。其中 user 是指向 User 类中的 ObjectId 的指针。
我在我的应用程序中创建了一个名为 getData() 的方法,其中包含一个 ParseQuery,它查询 Posts 类,选择 text 字段并包括 user 字段。然后查询将数据检索到 List 中,然后遍历 List 的每一行,从 text 字段中收集字符串,然后将其添加到 UI 上的 ListView每次程序通过循环时使用postList.add(textList.get(i).getString("text"));。
循环内是另一个查询,它查询User类,选择objectId 字段,然后我向查询添加一个约束,告诉它只检索 objectId 字段等于 userPosts 类中的 /em> 字段(我认为)。
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
接下来,我想获取查询检索到的收集到的用户名数据,将其放入一个字符串中,然后在屏幕上显示出来。所以基本上getData() 方法应该收集来自 text 字段和 username 的所有字符串发布它的用户。
问题是我不确定我是否正在尝试以正确的方式解决这个问题。我的应用程序在执行这段代码时抛出错误,所以我显然做错了什么。
java.lang.IllegalStateException: ParseObject has no data for this key. Call fetchIfNeeded() to get the data.
at com.parse.ParseObject.checkGetAccess(ParseObject.java:3235)
at com.parse.ParseObject.getString(ParseObject.java:2817)
at com.text.parse.MainActivity$3.done(MainActivity.java:186)
第 186 行代码:queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
我的问题是:
1. 我是否尝试以正确的方式做到这一点?
2. 为什么我会收到这个错误?
getData() 方法的代码:
public void getData() {
final ArrayList<String> postList = new ArrayList<String>();
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.listview_row, postList);
final ParseQuery<ParseObject> queryPosts = ParseQuery.getQuery("Posts");
queryPosts.selectKeys(Arrays.asList("text"));
queryPosts.include("user");
queryPosts.addDescendingOrder("createdAt");
queryPosts.setLimit(20);
queryPosts.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> textList, ParseException e) {
if (e == null) {
//query successful
for (int i = 0; i < textList.size(); i++) {
postList.add(textList.get(i).getString("text"));
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
queryUser.setLimit(20);
queryUser.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> userList, ParseException e) {
if (e == null) {
String s = userList.get(0).getString("username").toString();
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
}
else {
//query error
Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
}
}
});
}
lvText.setAdapter(listAdapter);
} else {
//query error
Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
}
}
});
}
对不起,很长的问题。任何帮助将不胜感激,谢谢。
更新:
对于遇到类似问题的任何人,这是我如何让它工作的:
public void getData() {
final ArrayList<String> postList = new ArrayList<String>();
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.listview_row, postList);
final ParseQuery<ParseObject> queryPosts = ParseQuery.getQuery("Posts");
queryPosts.include("user");
queryPosts.addDescendingOrder("createdAt");
queryPosts.setLimit(20);
queryPosts.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> textList, ParseException e) {
if (e == null) {
//query successful
for (int i = 0; i < textList.size(); i++) {
postList.add(textList.get(i).getString("text"));
ParseObject po1 = textList.get(i);
ParseObject po2 = po1.getParseObject("user");
String username = po2.getString("username");
Toast.makeText(MainActivity.this, username, Toast.LENGTH_SHORT).show();
}
lvText.setAdapter(listAdapter);
} else {
//query error
Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
}
}
});
}
您只需在要查询的类中包含指向另一个类的指针的列,然后您就可以访问第二个类中的所有数据列。
【问题讨论】:
标签: android database parse-platform pfquery parse-android-sdk