沒錯,傑夫老師最近在玩 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 提到,資料庫更應該像是一個 dict 字典的型態。其實從 Firebase 的說明文件中就看到「所有 Firebase 實時數據庫數據都存儲為 JSON 對象。您可以將數據庫視為雲託管的 JSON 樹。」既然原本就是個 JSON 樹結構,那就更應該好好利用啊!
那這樣,AI2 在存入資料的時候改用 dict 字典型態,會怎麼樣呢?來看看下面的程式:
這裡還是先利用 Tag: 0 儲存資料筆數,並先刪除 FDB 中所有資料。
儲存的時候改用 dictionary 字典型態
讀取時也是先檢查型態,確定為 dictionary 字典型態後,再以 key 找出相應 value
這裡還是先利用 Tag: 0 儲存資料筆數,並先刪除 FDB 中所有資料,輸入兩筆資料後結果如下:
模擬器畫面與結果
FDB 資料
已經知道了 AI2 存入的 list 不是 list 但 AI2 卻能轉換型態之後,看到現在的結果就不會驚訝,因為即使 AI2 存入的 dict 不是 dict 型態,但確信 AI2 讀回後也能無痛轉換。所以,模擬器得出現的結果是:
true
Elf, 80
但問題還在呀~若使用 Python 讀取 FDB 肯定還是 str 字串型態,那不行呀!下面的程式完沒改,直接看輸出結果就好:
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]))
輸出結果:
['2', '{"Name":"Elf","Score":"80"}', '{"Name":"Fred","Score":"73"}'] <class 'list'>
{"Name":"Elf","Score":"80"} <class 'str'>
說了半天,傑夫老師到底是要怎樣啦?😒
有沒有注意過,FDB 上可以手動加資料,資料包含 key (Tag) 與 value,value 還可以選型態。
FDB 可以手動增加資料
是的~這才是傑夫老師想要的,因為這才符合 JSON 結構吧。🤓
來用 Python 寫入 dict 資料看看。執行前先將 Tag: 1, 2 的兩筆資料先刪除。
from firebase import firebase
fbdb_url="https://000000-default-rtdb.firebaseio.com/"
fbdb = firebase.FirebaseApplication(fbdb_url, None)
D1={"Name":'Ivy', "Score":13}
D2={"Name":'Joe', "Score":99}
fbdb.put("FB_test1", name=1, data=D1)
fbdb.put("FB_test1", name=2, data=D2)
datas = fbdb.get("/FB_test1", None)
print(datas, type(datas))
print(datas[1], type(datas[1]))
輸出結果:
['2', {'Name': 'Ivy', 'Score': 13}, {'Name': 'Joe', 'Score': 99}] <class 'list'>
{'Name': 'Ivy', 'Score': 13} <class 'dict'>
Python 執行完,FDB 結果
為什麼!?Python 寫入 dict 型態的資料就可以有這樣的階層?而且讀回的資料型態就是 dict。
不對!問題應該是:為什麼 AI2 寫入後就還是字串型態?
只能這樣解釋了:AI2 的 FirebaseDB 還只是 "Experimental" 實驗性質的擴充,效果不如預期是理所當然的啦~
那~要怎麼讓 AI2 寫入的資料也有這樣的階層呢?這就等到傑夫老師下一 part 再說咯! Bye now~