Я создал приложение, использующее Parse. Мое приложение позволяет пользователям регистрироваться, входить в систему, а затем отправлять сообщения в облачную базу данных синтаксического анализа.
У меня есть два класса Parse: один называется User, а другой называется Posts. Пользователь состоит из ObjectId, имени пользователя и . пароль, а Сообщения состоят из ObjectId, текста и пользователь. Из которых user является указателем на ObjectId в классе User.
Я создал в своем приложении метод getData()
, который содержит ParseQuery. Он запрашивает класс Posts и выбирает текст. поле и включает поле user. Затем запрос извлекает данные в список, а затем перебирает каждую строку списка, собирая строку из поля text, а затем добавляет ее в ListView в пользовательском интерфейсе. используя postList.add(textList.get(i).getString("text"));
каждый раз, когда программа проходит через цикл.
В цикле находится еще один запрос, который запрашивает класс User, выбирает objectId, затем я добавляю в запрос ограничение, чтобы он извлекал только те данные, где поле objectId равно пользователю в классе Posts (я думаю).
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"));
Мои вопросы:
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();
}
}
});
}
Вы просто включаете в запрашиваемый класс столбец, содержащий указатель на другой класс, который затем дает вам доступ ко всем столбцам данных во втором классе.