假設我在 Firebase的 Realtime Database的資料結構長這樣
應該可以發現這會是一個三層的data,因此如果我們想要儲存這些Data,就會用一個三維的陣列儲存起來
String[][][] dataArray = new String[i][j][k];
i j k 的值是由Database中的data決定的,如果由上圖中的data結構,就可以知道
總共有六層,每層有四列,每列有兩個元素
簡單來說,這就是一個6*4*2的三維矩陣,因此i=6 j=4 k=2,即 String[][][] dataArray = new String[6][4][2];
不過在編寫程式中,我們不能這樣寫,因為會固定了矩陣的大小
若database的資料多了或少了,這樣就無法完美的抓到data
因此有一個方法可以抓到size,但我們後續再提。
現在開始正式的介紹要如何在Android Studio中抓取Firebase Realtime Database的data
會自動import的東西有
import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener;
需要加入在全域的type有
FirebaseDatabase mdatabase; DatabaseReference mRef;
如果想要把「從firebase中取得data」這項功能寫成一個class(物件)也可以
不過你也可以直接寫在onCreate()裡面,這樣在APP一執行的時候 就會幫你抓好data了
但前提是你的手機必須有連上網路才可以唷
我們開始看關於下面這張圖的意思吧
這就是為什麼在上述中要加入 FirebaseDatabase以及DatabaseReference的原因
這兩行可以解釋成「連接到你的Firebase」
由Debug模式中,大概可以了解到
mdatabase:取得FirebaseDatabase的實例,並連接到你的firebase
mRef:連接到forebase後,找到你的database
接下來我們看看關於下面這張圖的意思
也就是說,我們必須加入這個Listener才可以監聽資料的變動
在上個部分,我們已經連接到自己所設定的database位置了
接下來會add一個Linstener,主要功能是監聽你的資料是否有改變
在onDataChange裡,有一個DataSnapshot
一樣可以由Debug模式中看到這一步就是取得Database中的所有data了
來看看實際範例
arr儲存的格式維一個三維陣列
回到一開始的資料結構,總共有六層,每層有四列,每列有兩個元素
但在實際範例中,我arr想要儲存資料的結構如下,若以單一層表示
{ [dev0,dev1,dev2,dev3] ; [mean0,mean1,mean2,mean3]}
因此就會變成[6][2][4]
現在要提到關於如何取得「某一層」的size(大小)了,可以看到第7行
arr = new double[(int)dataSnapshot.getChildrenCount()]
[(int)dataSnapshot.child("place1").child("base1").getChildrenCount()]
[(int)dataSnapshot.child("place1").getChildrenCount()];
回顧一下最上面的資料結構圖,仔細看一下是不是有6層呢
在第7行中的 dataSnapshot.getChildrenCount() 就可以抓到最外層的數量,但需要特別注意的是
「getChildrenCount()這個方法回傳值是long」
我們無法再建立陣列物件時,大小的設定為浮點數
因此就要像這樣 (int)dataSnapshot.getChildrenCount()轉成int
至於[6][2][4] 的 2 要怎麼取得呢?
一樣回顧至最一開始的資料結構圖,可以發現 2 這個大小是在place/place1/base1 的大小
因此我們需要用到另一種方法,叫做 child(),記得這裡面要放的是String唷
所以也可以從第7行看到 (int)dataSnapshot.child("place1").child("base1").getChildrenCount()
最後[6][2][4] 的 4 就很簡單了吧
那就是 (int)dataSnapshot.child("place1").getChildrenCount()
從第8行的 for loop 開始到 第23行結束
都是在把「從firebase中抓下來的data存到arr裡面」
所以這個部分就不特別解說了
不過需要特別注意的是 第11, 12行
取值的方法是用 getValue()
但使用 getValue方法是 object 所以要加上一個 +"" 轉成 String (善用java轉型的特性XDDD)
因為抓下來的值是String,所以要轉成double
結束後 arr就會是一個存滿Database中的所有data了!