赞
踩
目录
数据库是一种数据存储技术,广泛地应用于各类应用中。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地址是“joe@zmail.com”,而他投票的内容是“比萨饼”,则保存到数据库。
通过互联网,网络数据库组件的保存数据块将上述标记-数值对发往数据库服务器,服务器的网址为http://appinvtinywebdb.appspot.com 。在你测试应用时,可以访问该网址,点击getValue链接,并输入刚刚保存数据时使用的标记,网页上将显示你刚刚保存的投票结果。
与本地数据库组件相比,用网络数据库组件提取数据的过程要复杂一些。由于本地数据库的请求数据操作是直接与安卓设备上的数据库通信,因而可以立即获得返回值。但网络数据库组件在请求数据时,数据要在互联网上进行传输,这需要一点时
间,因此请求数据的操作要分两步来实现。
在调用网络数据库组件的请求数据块时,其实只是向数据库发出数据请求,正如这个块被称作“请求数据”块,因为它只是发送请求,并没有立即获得数据库的返回值。这是本地数据库组件与网络数据库组件最大的差别,图中显示了两个数据库组件的请求数据块的差别。
比较两个数据库组件的请求数据块
本地数据库组件的请求数据块立即得到返回值,因此该块的左侧有一个插头以便将返回值保存到一个变量或组件的属性中;而网络数据库组件的请求数据块不能立即得到返回值,因此左侧没有插头。
对网络数据库组件而言,当数据库服务器回应了数据请求,并将数据返回给设备时,将触发该组件的获得数据事件。
(1)是调用请求数据块,然后再编写获得数据事件处理程序,来处理实际接收到的数据。获得数据事件处理程序也被称作回调过程,因为实际上是某些外部实体(这里指的是位于互联网上的数据库服务器)在处理完你的请求之后,反过来调用你的程序。
请求-获得联动机制
在我们的例子中,需要保存并提取一个投票者列表,因为应用最终要借助于每个投票人的Email地址,来获取他们的的投票结果。
要想从数据库中提取数据,最简单的方法是在应用启动时,在Screen1的初始化事件中,向数据库服务器发出请求。如图所示(,用“投票者列表”为标记向数据库服务器发出请求。)
图在屏幕初始化时请求数据
当投票者列表的数据从数据库返回时,将触发网络数据库组件的获得数据事件。图显示了处理这个返回列表的块。
获得数据事件携带了参数“数据”,这正是我们向数据库请求的数据。像“数据”这样的参数,可以理解为事件处理程序中的局部变量,它们只在该事件处理程序范围内有效,而无法在其他事件处理程序中使用。
事件参数不具有全局性,所以如果你想在应用中随时随地使用该参数,就需要将其转移到一个全局变量中。在这个例子中,事件处理程序的第一个任务就是将这个返回的“数据”转移到变量“投票者列表”中,这意味着你可以在其他事件处理程序中使用它。
通常会在获得数据事件中使用“如果”块,原因是,如果数据库中不存在被请求的数据,则将返回空文本(“”)。通常这种情况发生在第一次启动应用时。通过判断“数据”是否为列表,可以确定是否真的有数据返回。如果“数据”为空(如果块的测试结果为假),就不必将其写入变量投票者列表了。
图 在屏幕初始化时调用对话框1的显示文本对话框功能
图对话框组件的实际运行效果
在图中显示了向数据库请求数据的更为复杂的方法。
图在获得用户的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很容易实现数据的永久存储。数据以标记-数值对的方式存储。保存数据时使用的标记也用于之后对数据的提取。本地数据库组件用于将数据直接保存在设备上。所以说,网络数据库是本地数据库的一种延申。
而数据需要多人使用时,就需要使用网络数据库组件。网络数据库组件的使用更为复杂,
获取数据的环节:需要发出数据请求--》设置回调过程--》获得数据事件处理程序+同时还要设置网络数据库组件的服务地址属性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。