沒錯,傑夫老師最近在玩 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 提到,如果用 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~