tweetaniumのソースコードリーディング:model.js編
@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日前で現時点でどうしようか悩み中