Firebase, App Inventor 與 Python (Part 4)

沒錯,傑夫老師最近在玩 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 4. App Inventor 如何在 Firebase 上建立階層?

上一 part 提到,如果用 Python 可以在 FDB 上建立階層,也就會是一個 dict 字典的型態。而在 Python 終究可以輕易的做到,那在 AI2 中要如何建立呢? 傑夫老師找了很多資料都沒有找到,大多號稱OO老師的網站、YT 都沒提到,難道這太簡單所以沒人教嗎!?

先回到上一 part 的 FDB,來看看已經有了階層、已經是 dict 型態的兩筆資料,用原來 AI2 的程式是否能正確解析?

FDB 資料內容

程式與之前一樣,讀取後也是先檢查型態,再看能否用 key 找出相應 value

看到模擬器的結果如此,能正確解析,使用 key 取得 value。

那問題就在,AI2 中如何儲存才能建立跟 Python 一樣的資料內容了,但能用的只有 FirebaseDB.StoreValue 一個方法而已呀!

模擬器畫面

傑夫老師研究了很久,終於在一份類似學生專題報告的 pdf 檔中找到答案,那就不賣關子了,方法就是🥁🥁🥁....... 在Tag中用 / (斜線) 就可以做出階層

在Tag中用 / (斜線) 就可以做出階層

執行前,把 FDB 資料全部清除,再用此方式存入一筆新資料。結果如下:

除了 value 值多了 "" "" (兩對雙引號) 之外,這樣終於達到傑夫老師要的資料結構了。

FDB 資料內容

AI2 FirebaseDB.GotValue 的程式不變,讀取 Tag: 1 的內容後,模擬器結果如下:

true

"Kix", "100"

也是一樣,讀回來的資料確認是 dictionary 型態,也可以用 key 取出值,不過一樣多了 "" "" (兩對雙引號) 。

模擬器結果

從另一個地方,也可以找到用 / (斜線) 的線索,就是在 FDB 中點擊任何一筆資料,例如點在前面剛建立了 "Kix" 上,再點選上方複製網址 (Copy reference url) 取得網址,從網址中便能發現,每一層都可以網址的形式以 / (斜線) 串連起來。所以,從這裡也可以理解出為何 AI2 中的 FirebaseDB 擴充為何是這樣設計的。

取得之網址:

https://cd-menuorder01-default-rtdb.firebaseio.com/FB_test1/1/Name

取得網址方式

最後,再回頭用 Python 驗證,程式都沒變

from firebase import firebase


fbdb_url="https://000000-default-rtdb.firebaseio.com/"

fbdb = firebase.FirebaseApplication(fbdb_url, None)


datas = fbdb.get("/FB_test1", None)

print(datas, type(datas))

print(datas[1], type(datas[1]))

輸出結果:

['1', {'Name': '"Kix"', 'Score': '"100"'}] <class 'list'>

{'Name': '"Kix"', 'Score': '"100"'} <class 'dict'>

資料型態是 dict,不過一樣 key-value 中的值也被加了 " "(雙引號) 此所謂,不滿意但可以接受呀!

來試著在 Firebase console 中把將資料匯出為 JSON 格式來看看。

將資料庫內容匯出 JSON 方式

匯出的 JSON 內容如下,除了多餘的 " (雙印號) 一切都很 OK。其實這多餘的雙引號很不 OK,一定要看到最後。

[

"1",

{

"Name": "\"Kix\"",

"Score": "\"100\""

}

]

終於知道 AI2 要怎麼寫入有階層的資料,這樣在 FDB 中就不單單只是個二維清單。但傑夫老師為什麼這麼執著要做到這樣呢?那就留到下一 part 再說咯! Bye now~