发表日期: 2021-04-10 10:29:49 浏览次数:249
保定微信公众号开发【保定网络推广】保定建站、保定网站维护、保定网页制作、保定微信小程序代运营公司
保定,古称上谷、保州、保府,因城池似靴,又名靴城,位于河北省中心地带、太行山东麓,是京津冀地区中心城市,中国(河北)自由贸易试验区组成部分。
保定与北京相伴而生,保定之名取自“保卫大都,安定天下”,历来为京畿重地和“首都南大门”;有“北控三关,南达九省,畿辅重地,都南屏翰”之称。清代,保定为直隶省省会,是直隶总督驻地,自1669年至1968年三百年间,为河北政治、经济、文化、军事中心以及中国区域性政治中心,新中国成立后也两度为河北省省会。
保定是传说中尧帝的故乡,有着三千多年的历史,保定地区为燕国、中山国、后燕立都之地;诞生了荆轲、刘备、赵匡胤、祖冲之、郦道元等一批历史名人;市内文物古迹众多,如古莲花池、大慈阁、直隶总督署、清西陵等。
保定是国家历史文化名城、中国优秀旅游城市、国家园林城市,是中国首个创新驱动发展示范市、WWF低碳试点城市、全国双拥模范城,也是戏曲之乡、游泳之乡、“长寿之城”,因体育冠军辈出,又称“冠军之城”。2017年,保定市入选“2017年度中国最具投资潜力城市50强”。 [1-10]
截至2020年9月,保定市辖5区、4市、15县,常住人口1186万人,总面积22135平方公里,另设1个国家级高新区、1个副地级白沟新城。 [11] 拥有河北大学、华北电力大学、河北农业大学、中央司法警官学院等17所高校。2019年全年,全市生产总值完成3772亿元。 [12-15]
2017年4月,中共中央、国务院决定设立河北雄安新区,涉及保定市雄县、容城、安新3县及周边部分区域。
图 22-5 TinyDB.GetValue块

图 22-6 TinyWebDB.GetValue块
TinyDB.GetValue块立即得到返回值,因此该块的左侧有一个插头以便可以将返回值保存到一个变量或属性中;而TinyWebDB.GetValue块不能立即得到返回值,因此左侧没有插头。
对TinyWebDB而言,当web数据库实现了请求并将数据返回给设备时,将触发TinyWebDB.GotValue事件。因此整个提取数据过程分为两步,首先在一个地方调用TinyWebDB.GetValue,然后再编写TinyWebDB.GotValue事件处理程序,来处理实际接收到的数据。像TinyWebDB.GotValue这样的程序有时被称作回调过程,因为实际上是某些外部实体(这里是web数据库)在处理完你的请求之后,反过来调用你的程序。就像在一家繁忙的咖啡店点餐一样:你点餐,然后等待咖啡师喊你的名字,你才能真正拿到你的饮料。在同一时间,咖啡师会按顺序从每个人手里收取点餐单(而且所有人都在等待自己的名字被喊到)。
在我们的例子中,需要保存并提取一个投票者的列表,并最终显示所有人的投票结果。
最简单的方案是在应用启动时,在Screen.Initialize事件中发出请求来提取列表数据。如图22-7所示(在本例中,用“voterlist”为标签向数据库发出请求。)

图 22-7 在Screen.Initialize事件中请求数据
当应用从数据库收到投票者列表的数据时,TinyWebDB.GotValue事件被触发,图22-8显示了处理这个返回列表的块。

图 22-8 使用TinyWebDB.GotValue事件处理程序处理返回的列表
程序GotValue附带了参数valueFromWebDB,其中保存着向数据库请求的数据。像valueFromWebDB这样的事件附带的参数,只在该事件处理程序范围内有效(隶属于该事件处理程序),因此无法在其他事件处理程序中引用该参数。
这一点看似有些费解,但一旦你熟悉了这些保存局部数据的参数,你自然会联想到那些适用范围更大的数据(在整个应用中随处可用):变量。理解了这一点,也就理解了GotValue中的关键一步:将返回的数据valueFromWebDB转移到一个变量中。这里是将数据转移到变量voterList中,之后可以在其他的事件处理程序中使用该变量。
通常会在GotValue中同时使用if块,原因是,如果数据库中不存在被请求的数据,则返回值为空文本(“”),通常这种情况发生在第一次启动应用时。通过检查valueFromWebDB是否为列表,可以确定是否真的有数据返回。如果valueFromWebDB为空(if的测试结果为假),就不必将其写入变量voterList。
无论是TinyDB还是TinyWebDB,都是以相同的方式来获取数据、检查数据及设置数据(到变量中),不同的是,这里预期会收到一个列表,因此测试环节上略有差别。
在相对简单的应用中,图22-8中所示的代码是一种不错的提取数据的方式,但在投票的例子中,我们需要更为复杂的逻辑。说明如下:
应用启动时,程序会提示用户输入Email地址。可以使用Notifier组件弹出窗口来实现这一功能。(Notifier在组件设计器组件面板的User Interface中。)用户输入email后,将其保存为变量;
检查完用户的email之后,调用GetValue来提取投票人列表。你能说出为什么吗?
图22-9显示了向数据库请求数据的更为复杂的方案。

图 22-9 在这个更为复杂的方案里,在获得用户的email之后调用GetValue
在应用启动时(Screen1.Initialize),Notifier组件提示用户输入他的email地址;用户输入后(Notifier.AfterTextInput),输入的信息保存到变量中,同时用label显示出来,然后调用GetValue来获得投票人列表。需要注意,这里没有在Screen1.Initialize中直接调用GetValue,因为需要首先设置用户的Email地址。
因此当应用初始化完成后,用这些块来提示用户的Email地址,然后以“voterlist”为标签调用GetValue。当从web上返回列表时,GotValue被触发,以下是后续功能的描述:
GotValue将检查到达的数据是否不为空(有人已经使用这个应用,并建立了投票人列表)。如果返回值中包含数据(投票人列表),则检查此用户的email是否已经在投票人列表中,如果没有,将其添加至列表,并将更新后的列表保存到数据库;
如果数据库中没有投票人列表,我们将以此用户的email作为唯一的项来创建列表。
图22-10中显示了这一功能所需的块。

图 22-10 使用GotValue块处理数据库返回的数据,根据不同的返回结果确定要执行的操作
在这些块中,第一个if通过调用“is a list?”来检测从数据库返回的值,判断其是否不为空。如果不为空,返回的数据放入变量voterList中。切记,voterList中只有每个使用过该应用的用户的Email地址,但我们不确定当前用户是否也在此列表中,因此需要检查一下:如果此用户不在列表中,则用“add item to list”块将其添加至列表,并将更新后的列表保存到web数据库。