2017-08-13 2 views
0

Je veux retourner une chaîne à cette déclaration: String replyUsername = queryUsernameById(objectId);retourne une chaîne de méthode ParseQuery est null

Voici la méthode de requête:

public String queryUsernameById(String objectid) { 

     final String[] username = {null}; 
     ParseQuery<ParseUser> userQuery = ParseUser.getQuery(); 
     userQuery.whereContains(ParseConstants.KEY_OBJECT_ID, objectid); 
     userQuery.getFirstInBackground((user, e) -> { 

      // We found messages! 
      if (e == null) { 

       username[0] = user.getUsername(); 

      } else { 
       e.printStackTrace(); 
      } 
     }); 
     return username[0]; 
    } 

Quand j'afficher la chaîne, il retourne comme nulle. Comment puis-je réparer cela?

+0

Vous obtenez une erreur de votre bloc 'else'? Est-ce que 'user.getUsername()' n'est pas nul? – tima

+0

Aucune piletrace n'est imprimée. Il n'y a pas d'exception ParseException. – santafebound

Répondre

0

j'ai changé la méthode à ceci:

public String queryUsernameById(String objectId) { 

     String username; 
     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
     query.whereContains(ParseConstants.KEY_OBJECT_ID, objectId); 
     try { 
      ParseUser result = query.getFirst(); 
      username = result.getUsername(); 
      return username; 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

Il fonctionne, mais ce n'est pas tout à fait fiable. Parfois, il renvoie null. Étrange.

+0

Le résultat peut être indéfini s'il n'y a pas de valeur qui satisfasse vos contraintes de requête ici, ce qui provoquera une exception en essayant d'appeler 'getUsername()' –

1

Vous n'avez pas montré le reste de votre code, où vous utilisez réellement cette valeur, donc c'est difficile à dire à coup sûr, mais je suppose que l'asynchronasité vous gâche ici. La requête s'exécute en arrière-plan, donc si vous utilisez cette valeur trop proche de l'appel de la fonction, la requête n'est pas encore retournée. Vous devez affecter la valeur à l'étiquette dans le gestionnaire d'achèvement ou utiliser un écouteur de valeur de clé qui attend la mise à jour pour mettre à jour l'étiquette.

De plus, il existe une méthode de requête spécifique pour obtenir un objet par Id, plutôt que d'ajouter objectId comme contrainte de requête. query.get(objectId) ou quelque chose de similaire, même si je suis moins familier avec le Java SDK. Il a l'avantage de renvoyer une erreur 101 pour l'objet non existant, plutôt qu'un tableau/objet vide avec un rappel réussi.