我已经构建了一个使用Parse的应用程序。我的应用程序允许用户注册,登录,然后发布到解析云数据库。
我有两个Parse类,一个叫用户,一个叫帖子。 用户由 ObjectId , 用户名 和 组成密码 ,帖子由 ObjectId , 文字组成和 用户 。其中 用户 是指向用户类中 ObjectId 的指针。 />
我在我的应用中创建了一个名为getData()
的方法,其中包含一个ParseQuery,它会查询帖子类,选择 文本 字段,包含 用户 字段。然后查询将数据检索到List中,然后循环遍历List的每一行,从 text 字段收集String,然后将其添加到UI上的ListView中每次程序循环时都使用postList.add(textList.get(i).getString("text"));
。
在循环内是另一个查询,查询用户类,选择 objectId 字段,然后我向查询添加一个约束,告诉它只检索 objectId 字段等于 帖子类中的用户 字段(我认为)。
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
接下来,我想获取查询检索到的收集的用户名数据,将其放入字符串并在屏幕上以吐司形式显示。所以基本上getData()
方法应该从 文本 字段和 用户名 收集所有字符串发布它的用户。
问题是,我不确定我是否试图以正确的方式解决这个问题。执行此代码时,我的应用程序会抛出错误,因此我显然做错了。
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"));
我的问题是:
我想以正确的方式做这件事吗?
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();
}
}
});
}
您只需在要查询的类中包含该列,该列包含指向另一个类的指针,然后您可以访问第二个类中的所有数据列。
答案 0 :(得分:0)
如图所示,此方法无用:
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
selectKeys
语句告诉它只返回objectId
列的内容,你将其作为参数传递给whereEqualTo
语句......运行起来似乎很愚蠢获取已有值的查询!?在您认为需要优化查询之前,我不会使用selectKeys
。此查询唯一的用途是让您知道objectId
是否有效,因为如果null
不是objectId
,则查询将返回User
}。
我希望您希望获得有关该用户的更多信息,因此如果您删除selectKeys
,则会返回其他列。
fetchIfNeeded
因此行而引发异常的事实:
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
这表明textList.get(i).getString("user")
没有为用户返回objectId
。如果这是根据您的其他一些评论(不确定)建议返回username
,那么您需要将该行代码更改为:
queryUser.whereEqualTo("username", textList.get(i).getString("user"));
如果您还有其他一些问题,那么您的问题需要更准确一些,因为目前您所询问的内容并不十分清楚。