Я создал приложение, которое использует Parse. Мое приложение позволяет пользователям регистрироваться, входить в систему и публиковать их в базе данных облачных вычислений.
У меня есть два класса анализа, один из которых называется Пользователь и один под названием Должности. Пользователь состоит из ObjectId, пользователя и пароля и Сообщения состоит из ObjectId, текста и пользователя , Из которых пользователь является указателем на ObjectId в пользователя класса.
Я создал метод в моем приложении под названием getData()
, который содержит ParseQuery, это запрашивает класс сообщений, выбирает текст поле и включает в себя пользователя поле. Затем запрос извлекает данные в список, а затем циклически перебирает каждую строку списка, собирая строку из поля , а затем добавляет его в списокView в пользовательском интерфейсе, используя 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"));
Мои вопросы:
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();
}
}
});
}
Извините за длинный вопрос. Любая помощь будет очень признательна, спасибо.
UPDATE:
Для тех, кто застрял с подобной проблемой, вот как я получил его на работу:
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();
}
}
});
}
Вы просто включить столбец в классе вы запрашиваете, что содержит указатель в другой класс, который затем дает вам доступ ко всем столбцам данных во втором классе.
Спасибо за ответ. Я просто хочу заставить его делать то, что я хотел бы сделать, вернуть все сообщения и имя пользователя пользователя, принадлежащего каждому сообщению. Я не хотел ставить свой вопрос как «как я делаю эту работу», поскольку я знаю, что люди здесь будут сходить с ума. –
Если вы сделаете столбец 'user' указателем на« Пользователь »в сообщении, вы можете просто использовать' postQuery.include («user») ', чтобы сделать все свойства пользователя доступными. –
Я попробую позже, когда я вернусь домой с работы :) –