#freeze [[FrontPage]] #contents 2011/07/31からのアクセス回数 &counter; ** テーブルビューをデータベースに保存 [#g38726dd] [[titanium/テーブルビューを作る]] の結果をデータベースに保存できるようにします。 ここでも [[Titanium Mobileで作る! iPhone/Androidアプリ第10回>http://gihyo.jp/dev/serial/01/titanium/0010]] を参考にものまねします。 データベースにテーブルrecordsを作成し、カラムに - id: 整数の識別子主キー - weight: 体重(text) - at: 計測日(real) SQLiteでは、日付はtextまたはrealで保持するのが一般できみたいですが、textではソートが正しく行われないため、ここではrealを使います。 record_db.jsにデータベースの基本処理を定義します。 redord_db.jsの内容 #pre{{ var RecordDB = function() { this.dbName = 'recorddb'; this.open = function () { this.db = Titanium.Database.open(this.dbName); }; this.close = function () { this.db.close(); }; this.setRows = function (rows) { var res = []; if ( rows.getRowCount() > 0 ) { Ti.API.debug('Found: ' + rows.getRowCount() ); for (i =0; rows.isValidRow(); i++) { var record = {}; record.id = rows.fieldByName('id'); record.weight = rows.fieldByName('weight'); var time = rows.fieldByName('at', Titanium.Database.FIELD_TYPE_DOUBLE) record.at = new Date(); record.at.setTime(time); res.push(record); rows.next(); } } return res; }; this.deleteOne = function(record) { this.open(); var res = this.db.execute( 'DELETE FROM records WHERE id=?', record.id ); Ti.API.debug('Delete from DB'); this.close(); return true; }; this.update = function(record) { this.open(); Ti.API.debug('update at.getTime():' + record.at.getTime()); var res = this.db.execute( 'UPDATE records SET weight=?, at=? WHERE id=?', record.weight, record.at.getTime(), record.id ); Ti.API.debug('Update DB'); this.close(); return true; }; this.insert = function(record) { this.open(); Ti.API.debug('insert at.getTime():' + record.at.getTime()); var res = this.db.execute( 'INSERT INTO records (weight, at) VALUES(?,?)', record.weight, record.at.getTime() ); Ti.API.debug('Insert into DB'); this.close(); }; this.findAll = function() { this.open(); var rows = this.db.execute( 'SELECT * FROM records ORDER BY at DESC' ); var res = this.setRows(rows); rows.close(); this.close(); return res; }; // テーブル作成 this.open(); //this.db.execute('DROP TABLE records'); this.db.execute('CREATE TABLE IF NOT EXISTS records ( id INTEGER PRIMARY KEY, weight TEXT, at real)'); this.close(); }; }} ** テーブルビューの変更 [#i9445eb0] データベースに対応するために、table_view.jsのデータセットとコールバック処理部を以下のように変更します。 table_view.jsのデータセットとコールバック処理部 #pre{{ Ti.include('record_db.js'); var db = new RecordDB(); var records = db.findAll(); function insertCallback(record) { db.insert(record); records = db.findAll(); updateRecord(records); } function updateCallback(record) { db.update(record); records = db.findAll(); updateRecord(records); } function deleteCallback(index) { db.deleteOne(records[index]); records = db.findAll(); updateRecord(records); } }} *** 日付がずれる [#h964848a] どうしてか分からないのですが、javascriptのDateのgetTimeの値が文字列からの変換時に、 10~30秒ほど前後してしまい、表示の日付が1日ずれてしまいます。 これを回避するために、非常に場当たり的ですが、日付の設定をお昼の12時にすることにしました。 また、前回は、indexを使っていましたが、今回はidに変更します。 record_window.jsの変更部分にrecord.at.setHours(12);を追加 #pre{{ saveButton.addEventListener( 'click', function () { var record = {}; record.id = win.record.id; record.weight = weightField.value; record.at = new Date(dateField.value); record.at.setHours(12); Ti.App.fireEvent(win.func, record); win.close(); }); }} *** 動作確認 [#sfbfaa89] 実際に動かしてみます。 代わり映えしませんが、きちんと追加、変更、削除ができることが確認できました。 &ref(data_base.png); ** コメント [#l2c782be] #vote(おもしろかった[3],そうでもない[0],わかりずらい[0]) #vote(おもしろかった[4],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 - Ti.App.fireEventで送った時にDateの時刻がずれることが分かりました。 -- [[竹本 浩]] &new{2011-08-02 (火) 16:18:31}; #comment_kcaptcha