Android - 解析查询以获取所有帖子和与帖子相关的用户
Android - Parse query to get all posts and the users to go with the posts
我制作了一个应用程序,用户可以在其中登录并 post 向我的 Parse 数据库发送文本。所有 post 都保存在帖子 class 内的文本列中,此 class 中的另一列是用户,它是指向我的用户 class 的指针,它有一个名为用户名,它是我想要检索的用户名字符串。
我设法查询了数据库并检索了文本列中的所有数据,将其全部放入一个字符串数组中,然后放入一个列表视图中在我的应用程序中。
接下来我想实现的是检索文本列中的所有 post 和 posted 的用户名通过查看帖子中的相关用户名列来查看每一个。
我可以在一个查询中完成所有这些操作还是应该创建另一个查询来执行此操作?
解析 classes:
用户
|对象 ID(字符串)|用户名(字符串)|密码(字符串)|
帖子
|对象 ID(字符串)|文本(字符串)|用户 (Pointer<_User>) |
用户将启动应用程序,注册一个用户名和密码,这会向用户 class 添加一行,其中包含他们的用户名和密码。然后,用户将创建一个 post,这将向帖子 class 添加一行,其中包含文本和指向在用户列中创建 post 的用户的指针。
查询和ListView代码:
//create new ArrayList and ArrayAdapter
final ArrayList<String> postList = new ArrayList<String>();
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.listview_row, postList);
//create new ParseQuery selecting all data within 'text' in descending order
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
//query
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> text, ParseException e) {
if (e == null) {
//query successful
int listSize = text.size();
//loop through each post in 'text'
for(int i = 0; i < listSize; i++){
//add each post to textArray
textArray[i] = text.get(i).getString("text");
}
//add all data in textArray to ListView
postList.addAll(Arrays.asList(textArray));
lvText.setAdapter(listAdapter);
}
else {
//query error
Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
}
}
});
这很简单,您可以在 "Include the [class you want to include] data with each [Class you're querying]" 的现有查询上使用 .include 并且您可以调用查询的对象,我相信如下:
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
query.include([field containing user reference]);
ParseObject parseUser = text.get(i).getParseObject(([field containing user reference]);
希望对您有所帮助!
更新
“我忘了提到我的帖子 class 中的 'user' 列是指向我的用户 [=] 中用户对象 ID 的 指针 34=]. Within the User class is a username column, 这是我想反馈给我的信息申请。
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
query.include("user");
String parseUserName = text.get(i).getParseObject(("user").getString("userName");
这可能是行不通的,错误提示您必须刷新对象才能获取数据。但首先试试这个,看看它是否有效,我知道一些其他技巧:
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
query.include("user");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> text, ParseException e) {
if (e == null) {
ParseQuery<ParseUser> query = ParseQuery.getQuery("_User");
query.whereEqualTo("objectId", text.get(0).getParseObject(""));
query.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(List<ParseUser> users, ParseException e) {
if (e == null) {
String parseUserName = users.get(0).getString("userName");
}
});
int listSize = text.size();
//loop through each post in 'text'
for(int i = 0; i < listSize; i++){
我制作了一个应用程序,用户可以在其中登录并 post 向我的 Parse 数据库发送文本。所有 post 都保存在帖子 class 内的文本列中,此 class 中的另一列是用户,它是指向我的用户 class 的指针,它有一个名为用户名,它是我想要检索的用户名字符串。
我设法查询了数据库并检索了文本列中的所有数据,将其全部放入一个字符串数组中,然后放入一个列表视图中在我的应用程序中。
接下来我想实现的是检索文本列中的所有 post 和 posted 的用户名通过查看帖子中的相关用户名列来查看每一个。
我可以在一个查询中完成所有这些操作还是应该创建另一个查询来执行此操作?
解析 classes:
用户
|对象 ID(字符串)|用户名(字符串)|密码(字符串)|
帖子
|对象 ID(字符串)|文本(字符串)|用户 (Pointer<_User>) |
用户将启动应用程序,注册一个用户名和密码,这会向用户 class 添加一行,其中包含他们的用户名和密码。然后,用户将创建一个 post,这将向帖子 class 添加一行,其中包含文本和指向在用户列中创建 post 的用户的指针。
查询和ListView代码:
//create new ArrayList and ArrayAdapter
final ArrayList<String> postList = new ArrayList<String>();
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.listview_row, postList);
//create new ParseQuery selecting all data within 'text' in descending order
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
//query
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> text, ParseException e) {
if (e == null) {
//query successful
int listSize = text.size();
//loop through each post in 'text'
for(int i = 0; i < listSize; i++){
//add each post to textArray
textArray[i] = text.get(i).getString("text");
}
//add all data in textArray to ListView
postList.addAll(Arrays.asList(textArray));
lvText.setAdapter(listAdapter);
}
else {
//query error
Toast.makeText(MainActivity.this, "query error: " + e, Toast.LENGTH_LONG).show();
}
}
});
这很简单,您可以在 "Include the [class you want to include] data with each [Class you're querying]" 的现有查询上使用 .include 并且您可以调用查询的对象,我相信如下:
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
query.include([field containing user reference]);
ParseObject parseUser = text.get(i).getParseObject(([field containing user reference]);
希望对您有所帮助!
更新
“我忘了提到我的帖子 class 中的 'user' 列是指向我的用户 [=] 中用户对象 ID 的 指针 34=]. Within the User class is a username column, 这是我想反馈给我的信息申请。
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
query.include("user");
String parseUserName = text.get(i).getParseObject(("user").getString("userName");
这可能是行不通的,错误提示您必须刷新对象才能获取数据。但首先试试这个,看看它是否有效,我知道一些其他技巧:
ParseQuery<ParseObject> query = ParseQuery.getQuery("Posts");
query.selectKeys(Arrays.asList("text"));
query.addDescendingOrder("text");
query.include("user");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> text, ParseException e) {
if (e == null) {
ParseQuery<ParseUser> query = ParseQuery.getQuery("_User");
query.whereEqualTo("objectId", text.get(0).getParseObject(""));
query.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(List<ParseUser> users, ParseException e) {
if (e == null) {
String parseUserName = users.get(0).getString("userName");
}
});
int listSize = text.size();
//loop through each post in 'text'
for(int i = 0; i < listSize; i++){