Firebase, App Inventor 與 Python (Part 2)

沒錯,傑夫老師最近在玩 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 2. App Inventor 存入的 list 不是 list!?

上一 part 提到,當 Tag 為數字時,FDB 上的資料型態就變成了 list,那這一 part 傑夫老師就來好好說明 FDB 上的 list 型態。

前面嘗試的過程中,傑夫老師改用了 Python 試試,這裡用的是很多人在使用的 python-firebase 套件,出自:
https://github.com/ozgur/python-firebase
安裝與使用方式也不多說,網上都查的到資料。

基於上一 part 資料庫的結果,先用 Python 來讀取 FDB 資料內容來看看,程式如下:

FDB 資料內容

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))

輸出結果:

[None, '["Aden","98"]', '["Ben","86"]'] <class 'list'>

沒錯吧!取回來的型態是個 list 清單,在 Python 中 datas[0] 為 None。

可是~眼尖的你一定發現了,從 AI2 寫入的資料 Name 與 Score, 看起來像是清單,卻被加了 ' ' (單引號)耶!?

加一行程式把型態出來看看

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

輸出結果:

["Aden","98"] <class 'str'>

果然,型態是 str 字串!仔細看就連裡面的 98 這筆資料也被加了 " " (雙引號),所以它也是個字串。沒錯! AI2 儲存資料時,都是以字串的型態存入,其實在 TinyDB 的時候就是這樣了,有發現嗎?

既然是個字串,那在 AI2 裡會是什麼結果?回頭看看下面的 AI2 程式:

按鍵按下去取 Tag 1 的值,確認是 list 型態才對其用 index 取值

如果用 AI2 讀取 Tag: 1 中的值,取回後其型態不但是 list 而且還可以分別用 index 取出 list 中的兩個值。

這雖然與 Python 的結果是不同的!!然而這證明了 AI2 在基本資料型態的轉換是很順利的,字串很容易就被轉為其他可對應的型態

true: 為 list 型態
list 中的值分別為 Aden, 98

但是,這衍生了另一個問題,若在 Python 中寫入一個 list 型態的資料會如何呢?

把 FDB 資料清空,再執行以下程式:

from firebase import firebase


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

fbdb = firebase.FirebaseApplication(fbdb_url, None)


D1=['Cindy', 23]

D2=['Dina', 88]

fbdb.put("FB_test1", name=1, data=D1)

fbdb.put("FB_test1", name=2, data=D2)

說明一下程式,寫入的方法為 put其中 name 參數即 Tag,此處設為整數;data 參數便是資料,兩筆資料都是 list 型態。

但資料庫內容變成這樣:

先發現到,資料不再是以 [ ] 框起來的字串形式存入,而是多了兩層分別是 Tag: 0, 1,這點符合前面所說,FDB 中若是 list 則 Tag 會是整數型態,而且從 0 開始

而且,由於宣告時 23, 88 都是整數型態,存到 FDB 之後也沒有被加 " " (雙引號) 變成字串型態。原來 FDB 會區分資料型態,然而 AI2 存入的 list 在別人 (FDB, Python) 眼裡卻不是個 list 呀!🤷

還有一點,以這樣的資料庫來看就是一個二維清單,說二維陣列可能更合適。但是,聰明的你是不是覺得資料庫更應該像是一個 dict 字典的型態,不但資料欄位清晰,而且在不同的語言下資料才能互通呀~

這就等到傑夫老師下一 part 再說咯! Bye now~