使用Android Studio 2.2.2 開發Firebase – Database篇 part2

作者 | 2016-11-25

 

本篇延續使用Android Studio 2.2.2 開發Firebase – Database篇,將介紹讀取Firebase資料時的另一種讀取方式。

先回顧一下前一篇讀取資料的方式:

前一篇介紹過,Firebase資料存放為JSON格式,每一筆資料、每一個欄位都是節點,讀取資料亦須一個一個讀取。但我們知道實務應用上,一個Table中動輒十多個欄位,少有三五個欄位的Table。在上述程式中一個欄位一個欄位讀取,也不是什麼太困難的事,只是,如此一來會降低程式的可讀性,萬一欄位有個增減或修改也是一大困擾。

mag_as222_db2_01

有沒有更好的方式呢?

mag_as222_db2_04

Firebase的getValue方法取值有幾種方式,上一篇採用的是空參數,不指定資料型態直接取值,現在我們要使用第二個方法,如文件所言,可以將取回的資料自動轉成我們所指定的類別,那不是很好嗎?

1. 設計一個相對應的JavaBean,類別屬性須和Firebase內的名稱相同。

2. 新增容器

ArrayList、HashMap、LinkedHashMap….皆可,將用於存放Firebase取回的資料,此例使用ArrayList ,限定型態為Contact。

3. 替換讀取資料程式碼

換成

如此一來,完全不須逐一讀取欄位,將取回的Contact型態資料放到清單list。

 

咦?adapter到哪裡去了?該怎麼顯示資料呢?

接下來我們要改用RecyclerView顯示資料,此篇重點非RecyclerVew,在此不細述RecyclerView.Adapter,請自行參考官網說明。

1.新增清單

在activity_main.xml加一RecyclerView 設定 id 為 recycler

mag_as222_firebase_db2_03

2. 新增單列顯示Layout

設計一個單筆資料layout,名為row.xml,內含兩個TextView,分別顯示聯絡人名字和電話。

mag_as222_firebase_db2_02

3. 新增一個類別MyRecyclerAdapter,繼承RecyclerView.Adapter

除了實作3個必要方外,須按規格提供一個繼承RecyclerView.ViewHolder的內部類別

ViewHolder有多種寫法,各位可依自己習慣撰寫程式碼。

第5行:建構子傳入要顯示的View

第11行:setValues方法傳入Contact型態物件,將資料填入欲顯示的TextView中。

 

由於前面採用ArrayList存放資料,所以需要將該ArrayList提供給Adapter顯示。

第3行:建構子傳入ArrayList<Contact>。

 

實作3個必要覆寫方法

4. 設定RecyclerView

回到主畫面程式,設定RecyclerView

 

5. 最後記得,讀取完資料後更新清單

mag_as222_firebase_db2_04

小編碎唸:RecyclerView最大好處在節省資源,但RecyclerAdapter的寫法真的有點小累人呀!感謝Firebase還提供了其他更好的方式顯示Firebase資料 (呼~)

Firebase在伺服端資料有任何異動,預設皆能同步回呼firebase的方法,伺服端不須自行撰寫推撥通知手持裝置有資料異動、也無須在手機端向伺服端發送query即可獲取最新資料。不過,此文中得到資料時一律list.add,那有沒有可能是刪除或修改呢?

有機會再來介紹Firebase的CRUD。

相關文章:

使用Facebook直接回應

7 thoughts on “使用Android Studio 2.2.2 開發Firebase – Database篇 part2

  1. 請問最後adapter.notifyDataSetChanged();
    這個是擺放在哪?
    我加入這個程式都會退出….
    有完整程式碼支援嗎?

    回覆
    1. Junior M 文章作者

      請問你是放在哪裡呢? 有無錯誤訊息?
      “讀取完資料後更新清單”adapter.notifyDataSetChanged();應寫在onDataChange()方法內“替換讀取資料程式碼”步驟後呦~

      回覆
  2. yujie

    請問一下我按照你的程式碼打完後開啟程式都會強制退出
    但我把
    Contact contact = ds.getValue(Contact.class);
    list.add(contact);
    這串刪掉之後就不會退出了,是為什麼呢?
    錯誤碼我也不清楚是哪一串所以把紅字的貼上來

    FATAL EXCEPTION: main
    com.google.firebase.database.DatabaseException: No properties to serialize found on class com.example.yujie.firebase2.Main2Activity$Contact
    at com.google.android.gms.internal.zzbqi$zza.(Unknown Source)
    at com.google.android.gms.internal.zzbqi.zzi(Unknown Source)
    at com.google.android.gms.internal.zzbqi.zze(Unknown Source)
    at com.google.android.gms.internal.zzbqi.zzb(Unknown Source)
    at com.google.android.gms.internal.zzbqi.zza(Unknown Source)
    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
    at com.example.yujie.firebase2.Main2Activity$1.onDataChange(Main2Activity.java:90)
    at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
    at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
    at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5306)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
    at dalvik.system.NativeStart.main(Native Method)

    回覆
    1. Junior M 文章作者

      請檢查Contact是否有寫Java Bean 的 setter getter 方法

      回覆

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *