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