Firebase, App Inventor 與 Python (Part 3)
沒錯,傑夫老師最近在玩 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 3. App Inventor 存入的 dict 也不是 dict!?
上一 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~