2017-01-06 25 views
1

我在接受this question这个新的问题出现在我脑海里。DataSnapshot值是否有空值?

在这个问题中,我描述我的示例代码:

boolean firstCallDone = false; 
boolean secondCallDone = false; 

DataSnapshot firstDataSnapshot = null; 
DataSnapshot secondDataSnapshot = null; 

onCreate() { 
    firstRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      firstCallDone = true; 
      firstDataSnapshot = dataSnapshot; 

      if (firsCallDone && secondCallDone) 
       doSomething(); 
     } 
     ... 
    } 
    secondRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      secondCallDone = true; 
      secondDataSnapshot = dataSnapshot; 

      if (firsCallDone && secondCallDone) 
       doSomething(); 
     } 
     ... 
    } 
} 

doSomething() { 
    // do something with firstDataSnapshot and secondDataSnapshot 
    ... 
} 

以上代码的目的是为了执行doSometing()经过两次火力地堡数据库被称为及其价值得到。

然后我意识到,而不是像这样验证if (firsCallDone && secondCallDone),我可以像这样验证它if (firstDataSnapshot != null && secondDataSnapshot != null)。那是因为据我所知,DataSnapshot 从来没有 null(在其值已被填入onDataChange()之后)。

但我不确定。 DataSnapshot是否有可能在onDataChange()内为空?如果有,那么发生这种情况的原因是什么?

回答

2

的DataSnapshot不能为空,无论是否有数据存在与否(因为你会得到一个空的,但非空DataSnapshot如果没有数据)。

+0

对于其他人想知道和寻找答案这个问题,也[检查此答案](http://stackoverflow.com/a/41513071/4112725) – koceeng

1

不,DataSnapshot的值永远不会是null

如果发生任何故障,则会触发onCancelled()方法。

顺便说一句,与其创建标志以确保每个侦听器已完成,您应该利用Tasks API来管理这些任务。 This answer from a Firebaser解释了这一点,也提供了一个类。

干杯:)

+1

Hey Wilik:DataSnapshot永远不会为空,即使没有任何值时也是如此。 'DataSnapshot.getValue()'可能返回'null',但快照本身将永远是一个有效的对象。这就是为什么你可以例如调用'snapshot.exists()'来查看你正在查询的位置是否有值。 –

+0

谢谢您更正@FrankvanPuffelen。在我的回答中,我所指的“DataSnapshot'的值”确实是'DataSnapshot.getValue()',但我刚刚意识到,在我重新阅读问题后,提问者并不意味着它的含义。我会编辑我的答案。 :) – Wilik

+0

是的。当我意识到这个问题是关于快照对象本身的时候,我也正在提供基于'getValue()'的答案。因此,我把迈克尔拉进了一个更权威的答案。 :-) –