2017-08-13 2 views
0

ich einen String zu dieser Aussage zurückkehren wollen: String replyUsername = queryUsernameById(objectId);einen String aus parseQuery Methode zurückkehrend ist null

Hier wird die Abfragemethode ist:

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]; 
    } 

Wenn ich den String es angezeigt als null zurückgibt. Wie kann ich das beheben?

+0

Erhalten Sie einen Fehler von Ihrem 'else' Block? Ist 'user.getUsername()' nicht null? – tima

+0

Kein Stacktrace wird gedruckt. Es gibt keine ParseException. – santafebound

Antwort

0

änderte ich die Methode dazu:

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; 
    } 

Es funktioniert, aber es ist nicht absolut zuverlässig. Manchmal gibt es null zurück. Seltsam.

+0

Das Ergebnis kann undefiniert sein, wenn es hier keinen Wert gibt, der Ihren Abfrageeinschränkungen entspricht und beim Aufruf von 'getUsername() 'eine Ausnahme auslöst –

1

Sie haben den Rest Ihres Codes, wo Sie diesen Wert tatsächlich verwenden, nicht gezeigt, also ist es schwer zu sagen, aber meine Vermutung ist, dass die Asynchronität Sie hier versaut. Die Abfrage wird im Hintergrund ausgeführt. Wenn Sie diesen Wert also zu nahe am Funktionsaufruf verwenden, wurde die Abfrage noch nicht zurückgegeben. Sie sollten den Wert im Completion-Handler der Beschriftung zuweisen oder einen Schlüsselwertlistener verwenden, der darauf wartet, dass das Update die Beschriftung aktualisiert.

Darüber hinaus gibt es eine Abfragemethode speziell zum Abrufen eines Objekts nach ID, anstatt objectId als Abfrageeinschränkung hinzuzufügen. query.get(objectId) oder etwas ähnliches, obwohl ich mit dem Java SDK weniger vertraut bin. Es hat den Vorteil, dass ein Fehler 101 für das Objekt zurückgegeben wird, das nicht existiert, und nicht ein leeres Array/Objekt mit einem Erfolgsrückruf.

Verwandte Themen