データベースを使ってみる
前回の記事ではTitanium.
タイムラインの取得
この実装のために今までのサンプルコードを一部改変します。最初の画面で自分の発言だけでなく、
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_

Titanium.Database
さて、
では今回は、
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();
};
では、
さらに次の部分(2), (3)でopenとcloseメソッドを定義しています。このメソッドはデータベースの処理を始めるときのTitanium.
この次に(4)で定義されているaddTweetメソッドは、
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;
の部分で、
SQLを発行した結果なにかデータが返ってきている場合は、
さらに次に続く部分が、
タイムライン中の全てのツイートに対してこの処理を行った後、
もう一つ重要なのは、
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)');
という文がある点です。この文は、
これでデータベースにツイートを格納する準備はできたので、
var db = new TweetDB();
twitterApi.statuses_home_timeline(
{
onSuccess: function(response){
db.addTweets(response);
updateTimeline(response);
},
onError: function(error){
Ti.API.error(error);
}
}
);
まずTweetDBオブジェクを作成し自分のタイムラインを取得したときに、
ツイートを取り出してみる
ツイートをデータベースに格納できるようになったので、
ツイートを取得するメソッドgetSavedTweetsをtweet_
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文を発行し、
twitterApi.statuses_home_timeline(
{
onSuccess: function(response){
db.addTweets(response);
<p> updateTimeline(db.getSavedTweets()); //この行が変更されています</p>
},
onError: function(error){
Ti.API.error(error);
}
}
);
タイムラインを取得した後にそのデータを保存し、
ツイートを検索してみる
今回はさらに、

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メソッドとほとんど同じですが、
続いてtable_
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;
このコードでは、
(3)の部分ではSearchBarの中の文字列が変化したときの処理を登録しており、
まとめ
駆け足になりましたが、