2016-12-15 25 views
1

在我的應用程序中,我可以通過datasnapshot.getchildren()獲得兒童數。 但是,如果我想將該計數存儲在變量中,該怎麼辦?Firebase安卓計數的孩子,並將其存儲在一個變量

mRefReg.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.i(dataSnapshot.getKey(),dataSnapshot.getChildrenCount()+"Count"); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

包括「mCount = dataSnapshot.getChildren」似乎不起作用。

+0

爲什麼是「mCount = ...「不工作?如果mCount是你的匿名類以外定義的變量,它應該可以工作。你的身份的錯誤信息是什麼? – Oliver

+0

Firebase最近發佈了雲端函數,看看這個[answer](http:// stackoverflow。 com/a/42713792/5861618) –

回答

1

您所看到的可能是Firebase中的數據異步加載。第一次遇到這種情況,這是一個很大的範式轉變。但是由於大多數現代雲API都以這種方式工作,所以最好儘可能快地接受它。

我發現的時候看到我們把一些日誌語句會發生什麼最簡單的方法:

System.out.println("Before adding listener"); 
mRefReg.addValueEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println("In onDataChange"); 
    } 
    public void onCancelled(DatabaseError databaseError) { } 
}); 
System.out.println("After adding listener"); 

相反的是你的直覺告訴你,這樣做的結果應該是:

Before adding listener

After adding listener

In onDataChange

原因是(正如我在開始時所說的)Firebase異步獲取數據庫中的數據。一個有趣的方式來實現這是爲了更改您的數據(例如在您的Firebase Database console中)。當你做出這種改變,onDataChange將被再次調用並打印另一張:

In onDataChange

不幸的是,這意味着你不能做以下處理子女數:

int count = -1; 
System.out.println("Before adding listener, count="+count); 
mRefReg.addValueEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     count = dataSnapshot.getChildrenCount(); 
     System.out.println("In onDataChange, count="+count); 
    } 
    public void onCancelled(DatabaseError databaseError) { } 
}); 
System.out.println("After adding listener, count="+count); 

因爲輸出將是:

Before adding listener: count=-1

After adding listener: count=-1

In onDataChange: count=3 (assuming you have 3 children)

我發現處理異步加載的最好方法是重新構造這個問題。不要說「首先我們得到點數,然後我們用它做xyz」,試着把它定義爲「每當我們點數時,用它做xyz」。這意味着你需要需要計數代碼移到onDataChange()

mRefReg.addValueEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     int count = dataSnapshot.getChildrenCount(); 
     // TODO: show the count in the UI 
    } 
    public void onCancelled(DatabaseError databaseError) { } 
}); 

如果要實現像這樣,在UI計數將更新每當更改數據庫的項目數。

+0

你確定是否有像getNumChildren()這樣的方法?因爲它給了我錯誤:「無法解析getNumChildren()方法!」 –

+0

無論如何,我有另一種方法工作。我只是使用「long count = dataSnapshot.getChildrenCount()」而不是整數,它的工作原理! –

+0

感謝您指出錯誤的方法名稱,我在我的答案中修復了代碼 –

2

您的問題中有一些信息缺失,但我想我知道發生了什麼。 Firebase中的監聽器是異步的,因此您無法設置一個簡單的變量。

選項進入:

1)聲明onDataChange方法中的變量。

2)只有在onDataChange方法完成時才使用變量。

3)在已聲明偵聽器的方法中傳遞迴調函數。

0
long ct = 0;  

public void Count() { 
      databaseReference.child("a").child("b").addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.exists()) { 
         ct = dataSnapshot.getChildrenCount()`enter code here`; 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 

     } 

在開始時調用此函數,並且每當子數在Firebase數據庫中增加或減少時,它都會更新變量ct。 希望它有幫助

相關問題