手机APP开发之MIT Appinventor详细实战教程(四),对数据库的思考以及对网络数据库的整理与研究
目錄
一、數據庫的應用原理
二、數據在本地的永久保存
三、從本地數據庫提取數據
四、用網絡數據庫組件保存數據
五、網絡數據庫及數據共享
七、請求數據及數據處理
八、設置專屬的網絡數據庫
九、總結
數據庫是一種數據存儲技術,廣泛地應用于各類應用中。QQ用數據庫保存每位用戶的賬戶信息、好友列表以及用戶發布的信息,而百度的數據庫中有互聯網上每個頁面的信息。盡管有些應用數據庫的規模沒有這么大,但幾乎每一個功能完整的應用都會涉及數據存儲技術。今天我們來通過APPinventor 來了解一下這個技術和數據庫這個組件的使用。
一、數據庫的應用原理
數據庫通信的應用 = 搭建數據庫服務器 + 編寫程序 + 本地應用與數據庫服務器之間的對接
但App Inventor已經將數據庫技術中最復雜的部分封裝在數據庫組件中,從而將其簡化,所以可以直接將數據保存到本地數據庫,也可以通過一些簡單的設計,將數據集中保存到互聯網上(網絡數據庫),從而實現數據的共享。
(1)短時信息
那些臨時保存在變量及組件屬性中的數據被稱為短時信息.
特點:
如果我們在其中輸入某些信息,并且在保存到數據庫之前關閉了應用,那么當應用重新打開時,這些數據將不存在。
(2)數據庫的特點
想要長期保存這些信息,就需要將它們保存到數據庫中。數據庫中的信息被稱為永久信息,因為當應用關閉后再重新打開時,數據依然存在
?
二、數據在本地的永久保存
App Inventor提供了兩個數據庫組件:本地數據庫及網絡數據庫。
本地數據庫可以將數據直接保存在安卓設備上這類應用不需要在不同設備以及不同用戶之間共享數據。
而網絡數據庫則是將數據保存到互聯網上,并可實現不同設備及不同用戶之間的數據共享。
這兩個數據庫組件非常相似,但本地數據庫更為簡單一些,
因此我們先來研究它。用本地數據庫可以將應用中的數據直接保存在安卓設備上,不需要做任何設置,而且只能在應用中訪問這些數據。
數據庫組件使用“標記-數值”對的方式保存數據。我們可以把他標記為“短信”,而數值是用戶在文本輸入框中新輸入的自動回復內容,比如“我在看電視,一會兒在聊”。
標記--->鑰匙,必須使用這把鑰匙才能從數據庫中提取已經存儲的數據。
一個應用中可能有多項需要永久保存的數據,可以保存到多個標記-數值對中。
但標記必須是文本,而數值既可以是單個的數據(一段文本或一個數字),也可以是一個列表。每個標記只能對應一個數值,因此,當你使用同一個標記保存一個新的數值時,將覆蓋原來的數值。
三、從本地數據庫提取數據
本地數據庫組件還提供了另一個內置功能模塊——請求數據塊,用于從數據庫中提取數據。
特點:
(1)請求數據塊有兩個參數,其中之一是“標記”。在使用該塊時,需要為標記提供具體的值,來請求相關的數據。
(2)請求數據塊是一個有返回值的塊,因此必須定義一個變量,或利用某個組件的顯示文本屬性,來接收請求數據塊的返回值,也就是說,調用請求數據塊必須填充到一個插槽中。
通常會在應用啟動時從數據庫中提取某些數據。App Inventor提供了一個特別的事件處理程序——屏幕(Screen)初始化程序,應用啟動時會觸發該程序。
注意當數據庫為空時,此時數據庫中不存在你要訪問的標記,可以為請求數據塊提供了另一個參數——無標記返回。
這里將請求數據塊的返回值寫入到回復內容標簽的顯示文本屬性中。如果數據庫中已經保存過數據,則將請求獲得的數據寫入回復內容標簽中;如果沒有與標記“自定義短信”相對應的數據,則將“我正在開車…”寫入回復內容標簽中。
本地數據庫組件將數據保存在安卓設備的數據庫中,這一點適用于那些不需要數據共享的個人應用。
當然,還有許多應用根本離不開數據共享,非終端設備上,只有這樣,不同用戶之間才能訪問并共享數據庫中的信息。
理解:網絡數據庫相當于部署在互聯網上的本地數據庫,可以將應用中的數據保存到互聯網上。
App Inventor提供的網絡數據庫組件。與本地數據庫一樣,網絡數據庫組件也提供了兩個內置的功能模塊——保存數據塊及請求數據塊,它們的功能也與本地數據庫中對應的塊相似。
默認情況下,網絡數據庫組件將數據保存到一個特定的數據庫中,這個數據庫由App Inventor團隊創建,網址是http://appinvtinywebdb.appspot.com?。這個網站中有了一個數據庫服務器,能夠響應來自網絡的數據請求。
但App Inventor開發者的權限和存儲空間都是有限的,只能用于應用的開發及測試。
讓我通過一個投票應用來介紹網絡數據庫組件的使用方法。
- 每次應用啟動之后,提示用戶輸入自己的Email地址,該地址既代表用戶的身份(用戶名),又是向數據庫中保存投票信息時使用的標記。
- 任何時候用戶都可以重新投票,這時,原有的投票內容將被覆蓋。
- 用戶可以看到群組中每個人的投票結果。
- 為簡單起見,需要投票的議題將在應用之外發布,如課堂上,教師宣布議題并要求每個學生進行電子投票。(其實這個例子的功能可以擴展,允許使用者在應用中發布投票議題,并向投票人顯示該議題。)
四、用網絡數據庫組件保存數據
與本地數據庫組件相同,網絡數據庫組件也具有保存數據功能,只是數據要保存到互聯網上。我們將編寫投票按鈕的點擊事件處理程序來實現這一功能。
五、網絡數據庫及數據共享
在用網絡數據庫組件保存投票信息時,使用的標記是用戶的Email地址,Email地址事先已經被保存到變量“我的郵箱”中(稍后將看到);而要保存的數據是用戶在投票輸入框中填寫的內容。現在假設用戶的Email地址是“joe@zmail.com”,而他投票的內容是“比薩餅”,則保存到數據庫。
?
通過互聯網,網絡數據庫組件的保存數據塊將上述標記-數值對發往數據庫服務器,服務器的網址為http://appinvtinywebdb.appspot.com?。在你測試應用時,可以訪問該網址,點擊getValue鏈接,并輸入剛剛保存數據時使用的標記,網頁上將顯示你剛剛保存的投票結果。
七、請求數據及數據處理
與本地數據庫組件相比,用網絡數據庫組件提取數據的過程要復雜一些。由于本地數據庫的請求數據操作是直接與安卓設備上的數據庫通信,因而可以立即獲得返回值。但網絡數據庫組件在請求數據時,數據要在互聯網上進行傳輸,這需要一點時
間,因此請求數據的操作要分兩步來實現。
在調用網絡數據庫組件的請求數據塊時,其實只是向數據庫發出數據請求,正如這個塊被稱作“請求數據”塊,因為它只是發送請求,并沒有立即獲得數據庫的返回值。這是本地數據庫組件與網絡數據庫組件最大的差別,圖中顯示了兩個數據庫組件的請求數據塊的差別。
?
?比較兩個數據庫組件的請求數據塊
本地數據庫組件的請求數據塊立即得到返回值,因此該塊的左側有一個插頭以便將返回值保存到一個變量或組件的屬性中;而網絡數據庫組件的請求數據塊不能立即得到返回值,因此左側沒有插頭。
對網絡數據庫組件而言,當數據庫服務器回應了數據請求,并將數據返回給設備時,將觸發該組件的獲得數據事件。
(1)是調用請求數據塊,然后再編寫獲得數據事件處理程序,來處理實際接收到的數據。獲得數據事件處理程序也被稱作回調過程,因為實際上是某些外部實體(這里指的是位于互聯網上的數據庫服務器)在處理完你的請求之后,反過來調用你的程序。
請求-獲得聯動機制
在我們的例子中,需要保存并提取一個投票者列表,因為應用最終要借助于每個投票人的Email地址,來獲取他們的的投票結果。
要想從數據庫中提取數據,最簡單的方法是在應用啟動時,在Screen1的初始化事件中,向數據庫服務器發出請求。如圖所示(,用“投票者列表”為標記向數據庫服務器發出請求。)
?
圖在屏幕初始化時請求數據
當投票者列表的數據從數據庫返回時,將觸發網絡數據庫組件的獲得數據事件。圖顯示了處理這個返回列表的塊。
獲得數據事件攜帶了參數“數據”,這正是我們向數據庫請求的數據。像“數據”這樣的參數,可以理解為事件處理程序中的局部變量,它們只在該事件處理程序范圍內有效,而無法在其他事件處理程序中使用。
事件參數不具有全局性,所以如果你想在應用中隨時隨地使用該參數,就需要將其轉移到一個全局變量中。在這個例子中,事件處理程序的第一個任務就是將這個返回的“數據”轉移到變量“投票者列表”中,這意味著你可以在其他事件處理程序中使用它。
通常會在獲得數據事件中使用“如果”塊,原因是,如果數據庫中不存在被請求的數據,則將返回空文本(“”)。通常這種情況發生在第一次啟動應用時。通過判斷“數據”是否為列表,可以確定是否真的有數據返回。如果“數據”為空(如果塊的測試結果為假),就不必將其寫入變量投票者列表了。
圖 在屏幕初始化時調用對話框1的顯示文本對話框功能
圖對話框組件的實際運行效果
在圖中顯示了向數據庫請求數據的更為復雜的方法。
圖在獲得用戶的Email之后調用請求數據塊(不在屏幕初始化時調用)
在應用啟動時(屏幕初始化事件中),利用對話框組件提示用戶輸入自己的Email地址;用戶完成輸入后,將觸發對話框組件的完成輸入事件;輸入的信息被保存到變量中,同時顯示在標簽中;然后調用請求數據塊來提取投票者列表。需要注意,這里沒有在屏幕初始化事件中直接調用請求數據塊,是因為需要首先設置用戶的Email地址。
再來概述一下上述代碼的功能:在應用初始化時,提示用戶輸入Email地址,然后以“投票者列表”為標記調用請求數據塊。當請求的數據從遠程數據庫中返回時,觸發獲得數據事件。以下是后續功能的描述。
- 在獲得數據事件中,判斷收到的數據是否為列表(如果已經有人使用過這個應用,將會創建投票者列表)。如果返回值中包含數據(投票者列表),則判斷當前用戶的Email是否已經在投票者列表中;如果沒有,將其添加至列表,并將更新后的投票者列表保存到數據庫中。
- 如果數據庫中沒有投票者列表,我們將以此用戶的Email作為唯一的項來創建投票者列表。
圖顯示了實現上述功能所需要的塊。
?
圖在獲得數據事件中處理數據庫的返回值,根據不同的返回結果執行不同的操作
在這些塊中,第一個“如果…則…否則”塊使用“是列表”塊來判斷數據庫返回的數據是否為列表。如果判斷結果為真,將返回的數據放入變量投票者列表中。切記,投票者列表中只有全體使用者的Email地址,但我們不確定當前用戶是否也在此列表中,因此需要進一步判斷:如果當前用戶不在列表中,則用添加列表項塊將其添加至列表,并將更新后的列表保存到數據庫中。
如果數據庫返回的結果不是列表,則執行否則分支;這說明還沒有人使用過這個應用。此時需要使用“列表”塊來設置投票者列表,將當前用戶的Email地址作為列表的第一項,然后將這個只有一項的投票者列表保存到數據庫中(同時也希望更多人加入!)。
?
當用戶點擊投票結果按鈕時,應用將從數據庫中提取所有投票結果并加以顯示。現在假設已經從數據庫中提取了投票者列表,并保存到全局變量投票者列表中,我們可以使用遍歷列表循環,以每個投票人的Email地址為標記,來請求每個投票人的投票結果,如圖所示。
?
圖 使用遍歷列表塊請求列表中每位成員的投票結果
這里將變量“投票結果”列表設為空列表,以便將數據庫返回的最新投票結果添加到列表中。在遍歷列表循環中,使用網絡數據庫組件的請求數據塊來處理列表中的每個列表項——Email,以Email的值為標記向數據庫發送請求。需要注意的是,這一系列的請求發出之后,要等到數據庫返回數據時,才能觸發獲得數據事件,繼而才能將投票結果添加到“投票結果”列表中。
為了處理這種復雜的情況,獲得數據事件處理程序需要利用事件所攜帶的參數“數據標記”,它會告訴你當前的返回值來自于哪一個請求。因此,如果標記是“投票者列表”,我們可以像之前那樣進行處理;如果不是“投票者列表”,我們可以假設它是用戶列表中某人的Email地址,是用戶點擊了投票結果按鈕所發請求的返回值。當這些請求返回時,我們希望將返回的數據——投票人及投票結果——添加到投票結果列表中,以便向用戶顯示。
八、設置專屬的網絡數據庫
設立于http://appinvtinywebdb.appspot.com?的默認數據庫僅供原型設計以及應用的測試。在向真實用戶正式發布應用之前,你需要為應用創建一個專屬的數據庫。
訪問網站http://appinventorapi.com/create-a-web-database-python-2-7?,經過設置的代碼與之前使用的App Inventor默認數據庫相同,它運行在谷歌的云服務上,你可以將自己的網絡數據庫免費部署在谷歌云服務上。
一旦創建并部署了屬于自己的數據庫,谷歌的云服務工具會分配給你一個網址,并通過這個網址來訪問你的數據庫。于是你可以將應用中網絡數據庫組件的服務地址屬性設置為這個網址,而不再是默認的網址(http://appinvtinywebdb.appspot.com?)。從此以后,當你在應用中使用網絡數據庫組件保存及請求數據的時候,與應用進行對接的將是你自己的新數據庫。
九、總結
相似之處:利用本地數據庫及網絡數據庫組件,App Inventor很容易實現數據的永久存儲。數據以標記-數值對的方式存儲。保存數據時使用的標記也用于之后對數據的提取。本地數據庫組件用于將數據直接保存在設備上。所以說,網絡數據庫是本地數據庫的一種延申。
而數據需要多人使用時,就需要使用網絡數據庫組件。網絡數據庫組件的使用更為復雜,
獲取數據的環節:需要發出數據請求--》設置回調過程--》獲得數據事件處理程序+同時還要設置網絡數據庫組件的服務地址屬性。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的手机APP开发之MIT Appinventor详细实战教程(四),对数据库的思考以及对网络数据库的整理与研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌电子邮件服务器,谷歌Gmail为什么
- 下一篇: 招商银行笔试题之漂流船问题