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~