2015-03-24 3 views
2

Я создал приложение, которое использует 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(); 
      } 

     } 
    }); 
} 


Вы просто включить столбец в классе вы запрашиваете, что содержит указатель в другой класс, который затем дает вам доступ ко всем столбцам данных во втором классе.

ответ

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")); 

Если есть некоторые другие вопросы, которые вы имеете, вы Вам нужно быть более точным в своих вопросах, поскольку на данный момент не совсем понятно, что вы просите.

+0

Спасибо за ответ. Я просто хочу заставить его делать то, что я хотел бы сделать, вернуть все сообщения и имя пользователя пользователя, принадлежащего каждому сообщению. Я не хотел ставить свой вопрос как «как я делаю эту работу», поскольку я знаю, что люди здесь будут сходить с ума. –

+1

Если вы сделаете столбец 'user' указателем на« Пользователь »в сообщении, вы можете просто использовать' postQuery.include («user») ', чтобы сделать все свойства пользователя доступными. –

+0

Я попробую позже, когда я вернусь домой с работы :) –

Смежные вопросы