2017-08-13 49 views
0

我想一个字符串返回此声明:String replyUsername = queryUsernameById(objectId);返回从ParseQuery方法的字符串为空

下面是查询方法:

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

当我显示的字符串返回空。我怎样才能解决这个问题?

+0

您是否从您的'else'块中收到错误?是'user.getUsername()'不为空? – tima

+0

未打印任何堆栈跟踪。没有ParseException。 – santafebound

回答

0

我改变了方法,以这样的:

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

它的工作原理,但它并不完全可靠。有时它返回null。奇怪。

+0

如果在这里没有符合查询约束的值,那么结果可能是未定义的,当尝试调用'getUsername()'时会导致异常。 –

1

你还没有显示你的代码的其余部分,你实际使用这个值的地方,所以很难说肯定,但我的猜测是异步性在这里搞砸了你。查询在后台运行,所以如果您使用的值太接近函数调用,查询实际上还没有返回。您应该将值分配给完成处理程序中的标签,或者使用等待更新以更新标签的键值侦听器。

此外,还有一种查询方法,专门用于通过Id获取对象,而不是将objectId添加为查询约束。 query.get(objectId)或类似的东西,虽然我不太熟悉Java SDK。它具有为不存在的对象返回101错误的好处,而不是具有成功回调的空数组/对象。