Firebase, App Inventor 與 Python (Part 1)

沒錯,傑夫老師最近在玩 App Inventor,正好研究到 Firebase Realtime Database 的部分,而且發現 App Inventor 與 Python 程式上很多不同的用法與結果,網路上找了半天也沒人說的清楚,那傑夫老師只好寫下來供自己也供大家參考,有任何問題可來信與傑夫老師討論喔!

除了說明使用的是 App Inventor 中歸類於 Experimental 的 FirebaseDB 元件外,其他 Firebase Realtime Database 的建立與 App Inventor 基礎就不多說,直接進入主題。
(AI2: App Inventor 縮寫、FDB: Firebase Realtime Database 縮寫)

Part 1. App Inventor 的 GetTagList 沒反應!?

這是網上找的一個範例(被我精簡過),目的就是要把資料一筆一筆的存入 Firebase 中,而 FDB 資料庫的設計是,Tag (也就是 Key,此沿用 AI2 用詞) 從 0 開始,Tag: 0 所存的 Value 為資料總筆數;第一筆資料存入 Tag: 1 的 Value、 筆資料存入 Tag: 2 的 Value 中... 以此類推。

手機模擬器畫面

FDB 資料內容

畫面初始時,先從FDB讀出資料總筆數

新增資料時,總筆數加 1 並存回 Tag: 0 中

聰明的你,一定跟傑夫老師一樣覺得 Tag: 0 這筆資料很多餘,因為有個 FirebaseDB.GetTagList 可以讀到所有的 Tag,並且可由回傳的 TagList 長度得知"總筆數"呀~所以程式Screen1.Initialize 部分修改如下:

畫面初始時讀取 TagList,並由 TagList 之長度得知資料總筆數,但此方法得不到回傳 TagList!

但此方法得不到回傳 TagList,就像什麼事都沒發生一樣。即便其他部分程式、資料庫都沒修改,但 GetTagList 完全沒反應!網路上找了許多文章,雖然有人也有一樣問題,但找不到相似的狀況。

我將資料庫手動改成這樣,因為這才是我想要的資料庫結構

而程式改成如此時,令人吃驚的結果出現了:

將 ProjectBucket 設為上一層,再以此層的名稱 FB_test1 做為 Tag 讀取資料值

讀回資料有一筆 *nothing*

讀回的資料竟然是 [*nothing*, "["Aden","98"]", "["Ben","86"]"],多了一筆 *nothing* !!這是為什麼呢?

看到了最外面有 [ ] 就會發現傳回的是一個 list,而 list 是從 0 開始的,*nothing* 應該是第[0]筆資料,那這樣下面的解釋就通了。
因為,
當 Tag 為數字的時候,FDB 就不是以 dict (字典) 的型態儲存,而是以 list (清單) 的型態儲存,既然不是字典就沒有 key-value (鍵值對),沒有了 key 也就沒有 Tag,那對這層資料做 GetTagList 就不會有反應咯~

懷疑嗎?其實這是傑夫老師繞了一大圈才得出的結論,下一 part 加入 Python 程式來看看上面說的對不對,那這一部份就先到這邊 Bye now~