2015-10-14 7 views
1

Что я по существу построил - это EditTextView, который собирает String, который при вводе пользователем пытается связаться с внутренним контентом, чтобы вытащить пользовательский " objectId ", это столбец в моей базе данных User.Поиск по сайту (Android) - Поиск по прямой ссылке

Функция showProfileActivity(), показанная ниже, просто работает, и я исключил ее, потому что она не имеет отношения к проблеме. Он принимает «objectId» пользователя и показывает профиль пользователя.

Что я хочу для «String userId», который является «ObjectId» пользователя в базе данных, который будет генерироваться динамически. Я знаю, что функция showProfileActivity() работает, потому что я могу буквально просто вводить String с жестко закодированным objectId, и это приводит меня к профилю этого пользователя.

Вопрос, на основе ввода строки пользователем в поле поиска, как я могу получить значение в соответствующем столбце «objectId»?

findViewById(R.id.submitSearch).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       EditText searchUserTextField = (EditText) findViewById(R.id.searchUserTextField); 

       // Value input to search field 
       final String searchInput = searchUserTextField.getText().toString(); 
       // System.out.println(searchInput); 

       // Initiate ParseQuery 
       final ParseQuery<ParseUser> query = ParseQuery.getQuery("username"); 

       // Look for the username that was typed into the search field 
       query.whereEqualTo("username", searchInput); 

       query.findInBackground(new FindCallback<ParseUser>() { 
        public void done(List<ParseUser> objects, ParseException e) { 
         if (e == null) { 
          // The query was successful. 

          // This works but clearly always loads the exact same user profile. I need this string to be loaded dynamically as a function of the user's search query. 
          String userId = "dj16qsXPle"; 
          // System.out.println(userId); 

          showProfileActivity(userId); 

         } else { 
          // Something went wrong. 
         } 
        } 
       }); 

       // Execute RemoteDataTask AsyncTask 
       new RemoteDataTask().execute(); 
      } 
     }); 
    } 

ответ

1

Я не уверен, что делает showProfileActivity, но поскольку вы передаете ему USERID я предполагаю, что это делает еще один запрос? Почему бы не сделать следующее:

Предполагая, что имена пользователей уникальны (в этом случае, похоже, вы также предполагаете это). Тогда метод findInBackground должен возвращать только одного пользователя.

query.findInBackground(new FindCallback<ParseUser>() { 
       public void done(List<ParseUser> objects, ParseException e) { 
        if (e == null) { 
         // The query was successful. 
         if(objects.size() > 0){ 
          ParseUser user = objects.get(0); 
          showProfileActivity(user); 
         } 
        } else { 
         // Something went wrong. 
        } 
       } 
      }); 

И в showProfileActivity, используя данные пользователя, делайте то, что делает showProfileActivity.

Или, если вы используете ObjectId для чего-то еще, вы можете сделать это:

ParseUser user = objects.get(0); 
showProfileActivity(user.getObjectId()); 

и это дает вам идентификатор, который вы ищете вместо закодированного один. Опять же, делая в showProfileActivity, что бы вы ни делали с objectId. Это может означать извлечение из отдельной таблицы с использованием objectId и т. Д.

+0

Хм ... Очень близко, кажется, но я получаю исключение IndexOutOfBoundsException. java.lang.IndexOutOfBoundsException: Недопустимый индекс 0, размер равен 0. Что это может означать? – drearypanoramic

+0

Это означает, что пользователей не совпадают. Позвольте мне отредактировать для вас очень быстро. Убедитесь, что вход пользователя username существует в базе данных Parse и попробуйте тот, который существует. Также добавьте измененный код после того, как я отредактировал –

+0

Да, он возвращает пустой список, что действительно странно, поскольку эти имена пользователей просто должны существовать. I/System.out: [] – drearypanoramic

1

В конечном счете выяснилось. Я дал вам ответ, потому что вы определенно обеспечили ядро ​​правильного решения. Моя ошибка заключалась в том, чтобы инициировать мой ParseQuery как таковой: final ParseQuery query = ParseQuery.getQuery ("username");. Он должен был быть только ParseQuery query = ParseUser.getQuery();

   // Initiate ParseQuery 
       ParseQuery query = ParseUser.getQuery(); 
       query.whereEqualTo("username", searchInput); 
       query.findInBackground(new FindCallback<ParseUser>() { 

        @Override 
        public void done(List<ParseUser> objects, ParseException e) { 
         if (e == null) { 
          // The query was successful. 
          System.out.println(objects); 
          ParseUser user = objects.get(0); 
          String userId = user.getObjectId(); 
          showProfileActivity(userId); 

         } else { 
          // Something went wrong. Look at the ParseException to see what's up. 
         } 
        } 
       }); 
+1

Рад, что вы поняли это, я должен был поймать, что я даже не видел этого –

+0

Спасибо. Я должен был это видеть! – drearypanoramic

+0

@LucasCrawford Я продолжал этот вопрос здесь относительно правильного обращения с IndexOutOfBoundsException, если вы за это! http://stackoverflow.com/questions/33139944/parsequery-properly-handling-throwindexoutofboundsexception-parse-com :) – drearypanoramic

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