#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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc