- 浏览: 3548837 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:38154
-
Cordova 3.x入门...
浏览量:607316
-
常用Java开源Libra...
浏览量:682346
-
搭建 CentOS 6 服...
浏览量:89357
-
Spring Boot 入...
浏览量:401860
-
基于Spring Secu...
浏览量:69698
-
MQTT入门
浏览量:91724
文章分类
最新评论
-
afateg:
阿里云的图是怎么画出来的?用什么工具?
各云服务平台的架构图 -
cbn_1992:
博主,采用jdbctoken也就是数据库形式之后,反复点击获取 ...
Spring Security OAuth2 Provider 之 数据库存储 -
ipodao:
写的很是清楚了,我找到一份中文协议:https://mcxia ...
MQTT入门(6)- 主题Topics -
Cavani_cc:
还行
MQTT入门(6)- 主题Topics -
fexiong:
博主,能否提供完整源码用于学习?邮箱:2199611997@q ...
TensorFlow 之 构建人物识别系统
数据库的使用
这回我们说说使用数据库来操作数据。具体来说,就是我们在Twitter客户端的Home页面,取得Timeline数据后将其保存,这样一来我们就能在启动的时候显示前一次取得的Timeline数据,也能够检索Timeline中的内容。
取得Timeline
在最开始的页面上我们不仅仅显示自己的信息,也将Follow中的人的Timeline取出来显示。在以前我们做成的table_view.js中,关于Timeline取得部分的代码做如下修改:
截止目前的message_window.js中的TwitterApi的初期化移到table_view.js中去,还有,通过TwitterApi对象实现TimeLine的取得。
Titanium.Database
在TItanium中,提供了通过Titanium.Database这个对象来访问RDBMS的功能,不管是在iPhone还是在Android中都能够使用提供的SQLite库。SQLite是Public Domain的RDBMS,由于其轻量并且高速的运行,被各个领域使用。如果习惯了MySQL等RDBMS的话,应该使用起来不会是困难。
这里,我们先做成一个连接数据库的对象,新做成一个tweet_db.js文件放置到Resources文件夹下,然后编写一下代码,在使用这个对象的时候,可以使用函数TweetDB。
我们从头解释一下这段代码。
最开始(1)的位置,把连接的数据库名设置到对象的属性中。
在下来的(2),(3)的位置,分别定义了open和close方法。这两个方法中,只是简单的实现了在数据库处理的开始时调用Titanium.Database.open,终了时调用close处理的功能。在open方法中,使用了Titanium.Database.open方法来开启数据库的连接。通过这个方法返回的Titatnium.Database对象来实现以后的各个数据库操作。
后边(4)的位置,我们定义了addTweet方法,将获取到TimeLine信息的数据tweets中需要保存的数据保存到数据库中。首先需要通过this.open()来连接到数据库。之后,对于TimeLine中的各个Tweet判断是否已经保存(A),没有保存的话,保存到数据库当中(B)。
其中所说的(A)处理就是,(5)位置的处理,对于保存到this.db当中的Titatnium.Database对象执行SQL的SELECT查询。其中第一个参数中的SQL语句里带有的‘?’是第二个参数以后为了变化SQL语句的占位符。
SQL执行后的结果中,如果有返回数据的时候,从execute方法的返回对象Titanium.Database.ResultSet的getRowCount()方法能判断出来。在这个例子中,返回数据的时候,判断getRowCount()比0大的时候,因为该Tweet已经被保存到了数据库中,所以不需要做任何处理,继续处理下一条Tweet。
还有在接下来的代码中,(B)的往数据库中保存数据部分,通过执行INSERT语句,将各个Tweet信息保存到DB中。
TimeLine中所有的Tweet处理完成之后,调用this.close()方法。关闭数据库连接,结束处理。
还有一个重要的地方是在定义了saveTweet方法之后,有以下代码:
这段代码在这个TweetDB对象在被new的时候,只执行一次,tweets表不存在的时候,在数据库中做成tweets表的CREATE TABLE语句。
这样一来我们就准备好了往数据库中保存Tweet。TimeLine取得部分中将会保存Tweet。
首先是做成TweetDB对象,在获取自己的TimeLine的时候,把内容传给addTweets方法,然后就能将Tweet内容保存到数据库中。
取出Tweet
因为我们已经把Tweet保存到了数据库中,表示的时候就需要从数据库中把Tweet取出来显示。这样一来,最新的Tweet和过去的Tweet就能连续的表示到页面上了。
下边在tweet_db.js中编写获取Tweet的getSavedTweets方法。
在(1)的位置,执行SELECT语句,将保存的所有Tweet取出。然后在(2)的位置将取出来的Tweet循环处理,挨个将其变化成和Twitter API返回的数据相同的结构。这里重点是循环处理的最后位置的rows.next()方法,一旦执行了这个方法,rows中指定的数据内容就变成了下一条数据,如果下一条数据不存在的话,isValidRow()将会返回false循环处理结束。
而且,Titanium.Database.ResultSet对象中的rows被close之后,以后将不能再被使用。所以还需要修改table_view.js中表示时候的Tweet取得方法。
TimeLine取得之后,将其保存,然后再从数据库总取得数据。
检索Tweet
在这篇的最后,我们来实现一下简单的检索功能:按下页面左上角的Search按钮后,弹出检索窗口,然后能通过用户名来检索Tweet。
在tweet_db.js中追加,返回包含特定字符的用户的Tweet的方法。
和getSavedTweets方法基本上是一样的。参数中要执行的查询SQL语句的WHERE部分稍有不一样。SQL的WHERE部分通过like检索screen_name,返回用户名中包含了特定字符的用户的Tweet。
下来继续修改table_view.js的显示部分。
在这部份代码中,(1)的位置是做成SearchBar对象。
(2)的位置是SearchBar中换行处理的监听。在(2)这里调用了刚才做好的searchByScreenName()方法,只显示用户名中包含输入的字符的用户的Tweet。
(3)的位置是SearchBar中字符发生变化时处理的监听。当SearchBar中没有字符的时候,将会把所有的Tweet表示出来。
SearchBar如果一直表示的话也不好,所以在(4)的位置将其先隐藏,然后在(5)的位置做成一个将SearchBar表示出来的按钮。
(6)的位置当按钮按下后,通过SearchBar对象的show()方法将其表示出来。
总结一下,我们说明了使用SQL来操作Tweet的数据,不仅能表示过去的Tweet信息,又能够实现Tweet的检索。从Tweet的例子当中我们也可以看出,在检索不重复保存的相同数据的时候,SQL也是很方便的。如果在使用Titanium开发应用的时候,需要使用大量的数据,最好考虑使用SQL。
这回我们说说使用数据库来操作数据。具体来说,就是我们在Twitter客户端的Home页面,取得Timeline数据后将其保存,这样一来我们就能在启动的时候显示前一次取得的Timeline数据,也能够检索Timeline中的内容。
取得Timeline
在最开始的页面上我们不仅仅显示自己的信息,也将Follow中的人的Timeline取出来显示。在以前我们做成的table_view.js中,关于Timeline取得部分的代码做如下修改:
Ti.include("lib/twitter_api.js"); Ti.include("twitter_settings.js"); Ti.include("tweet_db.js"); //initialization Ti.App.twitterApi = new TwitterApi({ consumerKey: TwitterSettings.consumerKey, consumerSecret: TwitterSettings.consumerSecret }); var twitterApi = Ti.App.twitterApi; twitterApi.init(); twitterApi.statuses_home_timeline( { onSuccess: function(response){ updateTimeline(db.savedTweets()); }, onError: function(error){ Ti.API.error(error); } } );
截止目前的message_window.js中的TwitterApi的初期化移到table_view.js中去,还有,通过TwitterApi对象实现TimeLine的取得。
Titanium.Database
在TItanium中,提供了通过Titanium.Database这个对象来访问RDBMS的功能,不管是在iPhone还是在Android中都能够使用提供的SQLite库。SQLite是Public Domain的RDBMS,由于其轻量并且高速的运行,被各个领域使用。如果习惯了MySQL等RDBMS的话,应该使用起来不会是困难。
这里,我们先做成一个连接数据库的对象,新做成一个tweet_db.js文件放置到Resources文件夹下,然后编写一下代码,在使用这个对象的时候,可以使用函数TweetDB。
var TweetDB = function() { this.dbName = 'tweetdb'; //(1) this.open = function () { //(2) this.db = Titanium.Database.open(this.dbName); }; this.close = function () { //(3) this.db.close(); }; this.addTweets = function (tweets) { //(4) this.open(); for (var i=0;i<tweets.length;i++) { var tweet = tweets[i]; var rows = this.db.execute( //(5) 'SELECT * FROM tweets WHERE status_id = ?', tweet.id_str ); Ti.API.debug('Found: ' + rows.getRowCount() ); if ( rows.getRowCount() > 0 ) continue; var res = this.db.execute( 'INSERT INTO tweets (screen_name, profile_image_url, tweet_text, status_id, created_at) VALUES(?,?,?,?,?)', tweet.user.screen_name, tweet.user.profile_image_url, tweet.text, tweet.id_str, tweet.created_at ); Ti.API.debug('Add to DB'); } this.close(); return true; }; this.open(); this.db.execute('CREATE TABLE IF NOT EXISTS tweets (screen_name TEXT, profile_image_url TEXT, tweet_text TEXT, status_id TEXT, created_at TEXT)'); this.close(); };
我们从头解释一下这段代码。
最开始(1)的位置,把连接的数据库名设置到对象的属性中。
在下来的(2),(3)的位置,分别定义了open和close方法。这两个方法中,只是简单的实现了在数据库处理的开始时调用Titanium.Database.open,终了时调用close处理的功能。在open方法中,使用了Titanium.Database.open方法来开启数据库的连接。通过这个方法返回的Titatnium.Database对象来实现以后的各个数据库操作。
后边(4)的位置,我们定义了addTweet方法,将获取到TimeLine信息的数据tweets中需要保存的数据保存到数据库中。首先需要通过this.open()来连接到数据库。之后,对于TimeLine中的各个Tweet判断是否已经保存(A),没有保存的话,保存到数据库当中(B)。
var rows = this.db.execute( 'SELECT * FROM tweets WHERE status_id = ?', tweet.id_str ); Ti.API.debug('Found: ' + rows.getRowCount() ); if ( rows.getRowCount() > 0 ) continue;
其中所说的(A)处理就是,(5)位置的处理,对于保存到this.db当中的Titatnium.Database对象执行SQL的SELECT查询。其中第一个参数中的SQL语句里带有的‘?’是第二个参数以后为了变化SQL语句的占位符。
SQL执行后的结果中,如果有返回数据的时候,从execute方法的返回对象Titanium.Database.ResultSet的getRowCount()方法能判断出来。在这个例子中,返回数据的时候,判断getRowCount()比0大的时候,因为该Tweet已经被保存到了数据库中,所以不需要做任何处理,继续处理下一条Tweet。
还有在接下来的代码中,(B)的往数据库中保存数据部分,通过执行INSERT语句,将各个Tweet信息保存到DB中。
TimeLine中所有的Tweet处理完成之后,调用this.close()方法。关闭数据库连接,结束处理。
还有一个重要的地方是在定义了saveTweet方法之后,有以下代码:
this.db.execute('CREATE TABLE IF NOT EXISTS tweets (screen_name TEXT, profile_image_url TEXT, tweet_text TEXT, status_id TEXT, created_at TEXT)');
这段代码在这个TweetDB对象在被new的时候,只执行一次,tweets表不存在的时候,在数据库中做成tweets表的CREATE TABLE语句。
这样一来我们就准备好了往数据库中保存Tweet。TimeLine取得部分中将会保存Tweet。
var db = new TweetDB(); twitterApi.statuses_home_timeline( { onSuccess: function(response){ db.addTweets(response); updateTimeline(response); }, onError: function(error){ Ti.API.error(error); } } );
首先是做成TweetDB对象,在获取自己的TimeLine的时候,把内容传给addTweets方法,然后就能将Tweet内容保存到数据库中。
取出Tweet
因为我们已经把Tweet保存到了数据库中,表示的时候就需要从数据库中把Tweet取出来显示。这样一来,最新的Tweet和过去的Tweet就能连续的表示到页面上了。
下边在tweet_db.js中编写获取Tweet的getSavedTweets方法。
this.getSavedTweets = function() { this.open(); var rows = this.db.execute( 'SELECT * FROM tweets ORDER BY created_at DESC' ); //(1) var res = []; if ( rows.getRowCount() > 0 ) { while ( rows.isValidRow() ) { //(2) var tweetObj = {}; tweetObj.user = {}; tweetObj.user.screen_name = rows.fieldByName('screen_name'); tweetObj.user.profile_image_url = rows.fieldByName('profile_image_url'); tweetObj.text = rows.fieldByName('tweet_text'); var date = new Date(rows.fieldByName('created_at')); tweetObj.created_at = date.toLocaleString(); res.push(tweetObj); rows.next(); } } rows.close(); this.close(); return res; };
在(1)的位置,执行SELECT语句,将保存的所有Tweet取出。然后在(2)的位置将取出来的Tweet循环处理,挨个将其变化成和Twitter API返回的数据相同的结构。这里重点是循环处理的最后位置的rows.next()方法,一旦执行了这个方法,rows中指定的数据内容就变成了下一条数据,如果下一条数据不存在的话,isValidRow()将会返回false循环处理结束。
而且,Titanium.Database.ResultSet对象中的rows被close之后,以后将不能再被使用。所以还需要修改table_view.js中表示时候的Tweet取得方法。
twitterApi.statuses_home_timeline( { onSuccess: function(response){ db.addTweets(response); updateTimeline(db.getSavedTweets()); }, onError: function(error){ Ti.API.error(error); } } );
TimeLine取得之后,将其保存,然后再从数据库总取得数据。
检索Tweet
在这篇的最后,我们来实现一下简单的检索功能:按下页面左上角的Search按钮后,弹出检索窗口,然后能通过用户名来检索Tweet。
在tweet_db.js中追加,返回包含特定字符的用户的Tweet的方法。
this.searchByScreenName = function (screen_name) { this.open(); var rows = this.db.execute( 'SELECT * FROM tweets WHERE screen_name like ?', '%' + screen_name + '%' ); var res = []; if ( rows.getRowCount() > 0 ) { while ( rows.isValidRow() ) { var tweetObj = {}; tweetObj.user = {}; tweetObj.user.screen_name = rows.fieldByName('screen_name'); tweetObj.user.profile_image_url = rows.fieldByName('profile_image_url'); tweetObj.text = rows.fieldByName('tweet_text'); var date = new Date(rows.fieldByName('created_at')); tweetObj.created_at = date.toLocaleString(); res.push(tweetObj); rows.next(); } } rows.close(); this.close(); return res.length ? res : null; ;
和getSavedTweets方法基本上是一样的。参数中要执行的查询SQL语句的WHERE部分稍有不一样。SQL的WHERE部分通过like检索screen_name,返回用户名中包含了特定字符的用户的Tweet。
下来继续修改table_view.js的显示部分。
var search = Titanium.UI.createSearchBar({ //(1) height:43, top:0 }); win1.add(search); search.addEventListener('return', function(e) //(2) { var query = e.value; var res = db.searchByScreenName(query); if (res) { updateTimeline(res); } search.blur(); search.hide(); }); search.addEventListener('change', function(e) //(3) { if (e.value.length == 0 ) { updateTimeline(db.savedTweets()); search.blur(); search.hide(); } }); search.hide(); //(4) var searchButton = Ti.UI.createButton( //(5) { title: 'search' } ); searchButton.addEventListener( //(6) 'click', function () { search.show(); } ); win1.leftNavButton = searchButton;
在这部份代码中,(1)的位置是做成SearchBar对象。
(2)的位置是SearchBar中换行处理的监听。在(2)这里调用了刚才做好的searchByScreenName()方法,只显示用户名中包含输入的字符的用户的Tweet。
(3)的位置是SearchBar中字符发生变化时处理的监听。当SearchBar中没有字符的时候,将会把所有的Tweet表示出来。
SearchBar如果一直表示的话也不好,所以在(4)的位置将其先隐藏,然后在(5)的位置做成一个将SearchBar表示出来的按钮。
(6)的位置当按钮按下后,通过SearchBar对象的show()方法将其表示出来。
总结一下,我们说明了使用SQL来操作Tweet的数据,不仅能表示过去的Tweet信息,又能够实现Tweet的检索。从Tweet的例子当中我们也可以看出,在检索不重复保存的相同数据的时候,SQL也是很方便的。如果在使用Titanium开发应用的时候,需要使用大量的数据,最好考虑使用SQL。
发表评论
-
VisualUI for Titanium Studio
2014-01-13 09:02 1546VisualUI for Titanium Studio is ... -
Google Auth (OAuth 2.0) for Titanium
2013-03-19 11:49 2055Google OAuth 2.0 for Titanium i ... -
Appcelerator Titanium: Up and Running
2013-03-19 08:40 46Appcelerator Titanium: Up and R ... -
Titanium SDK/Studio 3.0.0 Beta版发布
2012-11-07 09:36 463Titanium SDK/Studio 3.0.0 Beta版 ... -
Titanium SDK 3.0.0 Developer Preview
2012-10-29 16:15 303Titanium SDK 3.0.0 Developer Pr ... -
Appcelerator Partners With Largest Chinese Software Developer Network
2012-10-29 12:01 225(Marketwire - Oct 19, 2012) -Ap ... -
Titanium 3.0 预定10月份发布
2012-09-27 09:12 733Appcelerator CEO Jeff Haynie和 C ... -
Titanium SDK 2.1.3 RC is released – Support for iOS 6
2012-09-21 13:51 241---以下官方原文--- We understand the ... -
国内Ti开发者Winson的CBMVC框架
2012-08-06 15:55 1206目前关注Titanium的开发 ... -
Titanium的MVC框架"Alloy"的介绍
2012-07-18 14:37 4262Alloy(合金)是Appcelerator公司为Titani ... -
TCAD免费考试延长至7月末
2012-07-17 16:09 327Appcelerator延长这次TCAD免费考试的时间到7月末 ... -
TCAD认证考试
2012-07-13 11:31 2572Appcelerator从7/7开始免费开放TCAD(Tita ... -
【转】Appcelerator Cloud Push Notification in iPhone
2012-07-12 08:49 2763Push Notification in iOS Using ... -
【转】Appcelerator Cloud Push Notification in Android
2012-07-12 08:38 2487What is Push Notification? Push ... -
Appcelerator Titanium: Patterns and Best Practices
2012-07-10 10:58 373Appcelerator Titanium: Patterns ... -
Appceleator Cloud Services使用指南(3) - API Reference V1 (chm版本)
2012-05-28 15:22 1869Appceleator Cloud Services API ... -
Appceleator Cloud Services使用指南(2) - 创建第一个应用
2012-05-24 21:57 1784一步一步的创建一个最简单的,使用了ACS服务的应用。 1、新 ... -
Appceleator Cloud Services使用指南(1) - ACS介绍
2012-05-24 10:19 3267Appceleator Cloud Services( ... -
Titanium Mobile基础教程视频
2012-05-23 10:38 639dotinstall.com提供的一套在线Titanium M ... -
Jeff Haynie在GMIC2012表示应用开发者应注意本土化问题
2012-05-22 16:56 3355月10日-11日,2012全球移 ...
相关推荐
sublimetext-tita, Tita Titanium Mobile/Alloy sublime text 2插件 这个插件不再主动地维护 ***因为我不再使用 st2/st3 。 有人对 fork 感兴趣并维护它?替代插件:...
Titanium是一款JavaScript开发的开源移动应用框架,它允许开发者使用JavaScript编写原生iOS和Android应用。在Titanium中,我们可以通过HTTPClient模块来发送HTTP请求,与RESTful Web服务进行通信。REST...
Titanium Mobile API 是一款由 Appcelerator 公司提供的用于跨平台移动应用开发的强大工具包。该工具允许开发者使用 JavaScript 编写应用程序,并通过一套统一的 API 接口访问原生移动设备功能,如 GPS 定位、摄像头...
Android-titanium_mobile.zip,带有javascript的本地ios、android和windows应用程序,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
### TITANIUM智能手机应用开发教程知识点概览 #### 一、TITANIUM系统简介与特点 **TITANIUM系统**是一种基于云的移动应用程序开发平台,它支持跨平台开发,允许开发者使用JavaScript来编写原生移动应用程序。...
Titanium Mobile SDK 3.1.0 是一个用于构建原生移动应用的开发工具,尤其针对iOS和Android平台。这个版本的Apidoc是开发者的重要参考资料,它包含了完整的API文档,帮助开发者理解并使用Titanium框架的各种功能。...
Titanium Mobile是一种跨平台的移动应用开发框架,它允许开发者使用JavaScript、HTML和CSS来构建高性能的原生应用程序。该框架由Appcelerator公司开发,并支持iOS、Android以及其他多个操作系统。 #### 为什么要...
Titanium是一个开源的移动开发框架,它允许开发者使用JavaScript语言来构建原生的iOS、Android以及Windows应用程序。这个框架的核心理念是提供一个跨平台的解决方案,让开发者可以用一种语言编写代码,然后在多个...
[Packt Publishing] Appcelerator Titanium 移动应用开发教程 (英文版) [Packt Publishing] Creating Mobile Apps with Appcelerator Titanium (E-Book) ☆ 图书概要:☆ Develop fully-featured mobile ...
有关此工具的用途的更多信息,请查看:Android编译器指纹技术,使用APKiD检测盗版和恶意Android应用APKiD:适用于Android应用的PEiD安装pip install --upgrade wheel pip wheel --wheel-dir = / tmp / yara-python -...
Titanium是一个开源的JavaScript平台,允许开发者使用JavaScript、HTML和CSS来构建原生的iOS、Android和Windows应用。这份翻译版的手册覆盖了Alloy框架的多个核心概念,为开发者提供了一个全面的参考。 1. **Alloy...
总之,`node-titanium-sdk`是前端开发者进入跨平台移动应用开发领域的强大工具,结合Node.js的生态系统,它提供了一条高效的开发路径,让开发者可以用熟悉的JavaScript技术创建高性能、多平台的应用。
UX SDK是一套与产品无关的UI对象,可使用快速跟踪Android应用程序的开发。 另外,请查看的新开放源代码版本。 一体化 通过Maven声明依赖项: < groupId>com.dji</ groupId> < artifactId>dji-uxsdk</ ...
贾米钛 这将JavaScript BDD框架带到了Titamium Mobile。 入门 制作目录并获取Jasmine Titanium cd Resources mkdir spec lib vendor cd vendor git clone ... Titanium Mobile 1.7.2或更高
等等的相关连结,希望能对开发Android应用程式有帮助。如有不完善的地方,欢迎加以补充! !另外如果分类有不妥的地方,或标示部清楚的地方,也欢迎提出! !Android版本分布Android Developers - Dashboards程式码...
在移动应用开发领域,Titanium 是一个流行的选择,它允许开发者使用 JavaScript 来构建原生的 iOS 和 Android 应用。Titanium 的核心理念是通过跨平台的 JavaScript API 提供与原生功能的无缝对接,而插件开发则是这...