読者です 読者をやめる 読者になる 読者になる

TitaniumMobile勉強記

Web系エンジニア向けのキャリアアドバイザーやってましたが現在はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連(Node.js、Titanium)あたり

tweetaniumのソースコードリーディング:model.js編

Titanium Mobile javascript

@donayamaさんに褒められたのでtweetaniumのソースコードリーディングの続き書くことにしましたww

UI部分についてこれ以上書けるほどのネタがないので、Modelに関連する所ちょっと取り上げようと思います

ベースとなるmodel.js

「tweetaniumはTwitterクライアントだから、OAuth認証などの処理がまとまっているmodelらしいのがどれかなー」
と/Resources/tweetanium/model配下を眺めていたらAccount.jsというのがあったのでソースを眺めていたら17行目から21行目で

	tt.model.Account = function(_opts) {
		var that = new tt.model.Entity('Account');

		//add any passed properties to the object
		tt.mixin(that,_opts);

というのを見つけました。ついでにTweet.jsのソースを見ると上記と共通するtt.model.Entry(xxx)というのがあったので、このtt.model.Entryの処理を追っていくことにしました。

tt.model.Entryの実装はmodel.jsを見たら14行目あたりに

#/Resources/tweetanium/model/model.js
	//Create a persistent entity
	tt.model.Entity = function(/*String*/ _class, /*Object*/ _properties) {
		//mixin all properties for the object passed in
		tt.mixin(this,_properties);
		
		this._className = _class;
		
		//Create a table for this entity type
		var db = Ti.Database.open(tt.model.dbname);
		db.execute('CREATE TABLE IF NOT EXISTS '+_class+' (id INTEGER PRIMARY KEY, json TEXT)');
		db.close();

というのがありここの処理を理解すれば良そうです。

ソース見る限り

  • 初期化された際に実行される処理
  • DB(SQLite)へ値を書き込む処理であるsave()
  • idを引数にしてDBから値を読み込む処理であるload()
  • クラス名(=テーブル名)を引数にして該当の値を全部読み込む処理であるlist()
  • save()とload()とで共通利用されるhydrate()というユーティリティ的なもの

という感じのように見えました。

save()の動きを確認

実際の動きを確認したかったことに加えて、自分が作ってるブログリーダーアプリに応用できるかどうかも検証したかったので

#app.js
// 背景色設定
Titanium.UI.setBackgroundColor('#fff');
//名前空間。自分の所属会社がよくこの2文字なのでひとまずこれを採用
var pt = {};
//Include additional  namespaces
Ti.include(
  '/reader4asunaro/ui/ui.js',
  '/reader4asunaro/model/model.js',
  '/reader4asunaro/doit.js'
);
pt.doit.start();
#doit.js
(function() {
  pt.doit = {};
  pt.doit.start = function() {
    pt.main = pt.ui.createApplicationWindow();
    pt.action.createBloggerTable();
    # 〜中略〜
  };
})();
Ti.include(
  '/reader4asunaro/action/handleBlogger.js',
  '/reader4asunaro/action/handleEntry.js'
);
#handleBlogger.js
(function(){
   pt.action.createBloggerTable = function(){
     var blogger_list =
  {
    name:'日比 知子',
    userid:'hibi',
    twitterid:'satoko',
    first_post_date:'2006/08/10 23:09:00',
    picture:'10.jpg',
    blogTitle:'家で働くママ日記',
    description:'SI系企業で研究部門・パッケージ部門に従事。その後派遣で大手製造業のプロジェクター用マニュアル作成部門に1年冒険。2年ほど前にまたIT系に戻る。現在は2歳児の女の子を育てながら、サービスの開発・企画をやっています。'
    };
     var that = new pt.model.Entity('Blogger',blogger_list);
     that.save();
   };
})();

という感じのコードを書いて実行しました。

model.Entityの引数に ”Blogger”という名前を指定したのでSQLiteのDBにBloggerテーブルが作成され、JSON.stringifyによってテキスト形式に変換されていますがblogger_listのJSONデータもしっかり保存されていたので、自分が意図した通りの処理がtt.model.Entityで実装されていました

model.jsの活用

load()とlist()はしっかり読んでないものの、全体的に自分のニーズに結構マッチしているから、活用しようと思ったのですが自分が作ってるアプリの場合、ブロガー名&ブログエントリーの投稿日を引数にする処理が多いから、このままだとうまく活用できないじゃん・・・

このことに気づいたのが2、3日前で現時点でどうしようか悩み中