在一个查询中从另一个 class 检索数据
Retrieving data from another class in one query
我构建了一个使用 Parse 的应用程序。我的应用程序允许用户注册、登录,然后 post 到解析云数据库。
我有两个 Parse classes,一个叫 User,一个叫 Posts。 User由ObjectId,username[=组成99=] 和 password, Posts 由 ObjectId, text and 用户。其中user是指向ObjectId的指针用户 class.
我在我的应用程序中创建了一个名为 getData()
的方法,它包含一个 ParseQuery,它查询 Posts class,选择 text 字段并包括 user 字段。查询然后将数据检索到一个List中,然后循环遍历List的每一行,从text字段中收集String,然后添加它每次程序通过循环时使用 postList.add(textList.get(i).getString("text"));
进入 UI 上的 ListView。
循环内是另一个查询,它查询 User class,选择 objectId 字段,然后我向查询添加一个约束,告诉它只检索 objectId 字段等于 user 字段 帖子 class(我认为)。
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
接下来我想收集查询检索到的用户名数据,将其放入一个字符串中并在屏幕上以 toast 形式显示。所以基本上 getData()
方法应该从 text 字段和 [=35= 中收集所有字符串post编辑它的用户的]用户名。
问题是我不确定我是否正在尝试这是正确的方式。执行这段代码时我的应用程序抛出错误,所以我显然做错了什么。
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.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();
}
}
});
}
您只需将要查询的 class 中的列包含一个指向另一个 class 的指针,然后您就可以访问第二个 class.[= 中的所有数据列。 21=]
所示方法没有任何用处:
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
selectKeys
语句告诉它仅 return objectId
列的内容,您将其作为参数传递给 whereEqualTo
语句。 .. 运行 查询以获取您已经拥有的值似乎很愚蠢!?。在您认为需要优化查询之前,我不会使用 selectKeys
。此查询的唯一用途是让您知道 objectId
是否有效,因为如果它不是有效的 objectId
,查询将 return null
User
.
我希望您想要获得有关该用户的更多信息,因此如果您删除 selectKeys
,那么其他列将被 return 编辑。
fetchIfNeeded
由于这一行而抛出异常的事实:
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
这表明 textList.get(i).getString("user")
没有为用户 return 发送 objectId
。如果那是 returning username
正如您的一些其他评论所建议的那样(此处不确定),那么您需要将该行代码更改为:
queryUser.whereEqualTo("username", textList.get(i).getString("user"));
如果您还有其他问题,您的问题需要更准确一些,因为目前您的问题还不是很清楚。
我构建了一个使用 Parse 的应用程序。我的应用程序允许用户注册、登录,然后 post 到解析云数据库。
我有两个 Parse classes,一个叫 User,一个叫 Posts。 User由ObjectId,username[=组成99=] 和 password, Posts 由 ObjectId, text and 用户。其中user是指向ObjectId的指针用户 class.
我在我的应用程序中创建了一个名为 getData()
的方法,它包含一个 ParseQuery,它查询 Posts class,选择 text 字段并包括 user 字段。查询然后将数据检索到一个List中,然后循环遍历List的每一行,从text字段中收集String,然后添加它每次程序通过循环时使用 postList.add(textList.get(i).getString("text"));
进入 UI 上的 ListView。
循环内是另一个查询,它查询 User class,选择 objectId 字段,然后我向查询添加一个约束,告诉它只检索 objectId 字段等于 user 字段 帖子 class(我认为)。
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
接下来我想收集查询检索到的用户名数据,将其放入一个字符串中并在屏幕上以 toast 形式显示。所以基本上 getData()
方法应该从 text 字段和 [=35= 中收集所有字符串post编辑它的用户的]用户名。
问题是我不确定我是否正在尝试这是正确的方式。执行这段代码时我的应用程序抛出错误,所以我显然做错了什么。
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.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();
}
}
});
}
您只需将要查询的 class 中的列包含一个指向另一个 class 的指针,然后您就可以访问第二个 class.[= 中的所有数据列。 21=]
所示方法没有任何用处:
ParseQuery<ParseObject> queryUser = ParseQuery.getQuery("User");
queryUser.selectKeys(Arrays.asList("objectId"));
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
selectKeys
语句告诉它仅 return objectId
列的内容,您将其作为参数传递给 whereEqualTo
语句。 .. 运行 查询以获取您已经拥有的值似乎很愚蠢!?。在您认为需要优化查询之前,我不会使用 selectKeys
。此查询的唯一用途是让您知道 objectId
是否有效,因为如果它不是有效的 objectId
,查询将 return null
User
.
我希望您想要获得有关该用户的更多信息,因此如果您删除 selectKeys
,那么其他列将被 return 编辑。
fetchIfNeeded
由于这一行而抛出异常的事实:
queryUser.whereEqualTo("objectId", textList.get(i).getString("user"));
这表明 textList.get(i).getString("user")
没有为用户 return 发送 objectId
。如果那是 returning username
正如您的一些其他评论所建议的那样(此处不确定),那么您需要将该行代码更改为:
queryUser.whereEqualTo("username", textList.get(i).getString("user"));
如果您还有其他问题,您的问题需要更准确一些,因为目前您的问题还不是很清楚。