TONY0922のブログ

学んだことを適当に記録していくブログです。主にRuby, Java, PHPで仕事してます。更新頻度はそんなに高くないので、ご了承下さい。

Titanium MobileでiPhone開発後にAndroid対応をしてハマる所

Titanium SDK:3.2.0
Alloy:1.3.0





・requireでモジュールを読み込めない。
モジュールの定義が「exports」だと、Androidで読み込めない。
「module.exports」を使うこと。

・画像ファイルの指定方法が異なる。

# 画像を/app/assets/images/background.gifに配置
".container" : {
	backgroundImage : "images/background.gif" # 先頭にスラッシュがない。
}
iPhone 読み込める
Android 読み込めない
# 画像を/app/assets/images/background.gifに配置
".container" : {
	backgroundImage : "/images/background.gif" # 先頭にスラッシュがある。
}
iPhone 読み込める
Android 読み込める

SQLiteのInteger型をBoolean型のような動きを実現したいとき、
trueを設定した時、iPhoneは1に自動変換されるが、Androidではされない。
素直に1と0を使用して、制御しましょう。

随時、更新予定。

Titanium Mobileでrequireを使用して、モジュールを読み込む方法(Android/iOS)

Titanium SDK:3.2.0
Alloy:1.3.0

定数管理したJSファイルを読み込もうとしたんだが、

・constants.js (app/lib/constants.js)

exports = {
	test : {
		name : "hogehoge"
	}
}

alloy.js

Alloy.Globals.constants = require("constants");
console.log(Alloy.Globals.constants.test.name); // point1

これだと、point1でiPhoneでは、値が出力されるが
何故かAndroidだと動かない。
(constantsが{}になっていて、constants.test.nameがundefinedになる。)

これを下記のように直したら、動いた。

・constants.js (app/lib/constants.js)

module.exports = {
	test : {
		name : "hogehoge"
	}
}

CommonJSやmodule.exportsやexportsが
またそこまで理解できないので、時間を見つけて、調べる予定。

Titanium Mobile で定数管理

Titanium SDK:3.2.0
Alloy:1.3.0

Alloyで定数を管理するファイルを作成して、
グローバル変数で読み取る方法を考えた。

■ 定数ファイル (app/lib/constants.js)

module.exports = {
	config : {
		code001 : "XXXXXXXXXX",
		code002 : "YYYYYYYYYY"
	}
};

alloy.js

Alloy.Globals.constants = require("constants");

■ index.js

console.log(Alloy.Globals.constants.config.code001); // XXXXXXXXXX

2014-02-01 追記
module.exports を exportsにしてしまうと、Androidでは動きませんので注意。

Titanium Mobileでtsvファイルから初期データを入れる。

Titanium SDK:3.2.0
Alloy:1.3.0

tsvファイルから初期データ読み取って、テーブルに入れる方法を考えた。

■ tsvファイル

1行目 column1 column2 column3
2行目 aaa AAA 111
3行目 bbb BBB 222
4行目 ccc CCC 333
5行目 ddd DDD 444

/**
 * tsvファイルからインスタンスを作成し、データ作成。
 * 1行目はテーブルのカラム名を記述。
 * 2行目以降は1行目の同列のカラムのデータを記述。
 * @param {Object} filePath tsvファイルまでのpath
 * @param {Object} modelName モデル名
 */
function insertInititalData(filePath, modelName) {
	var fileData = Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory, filePath);
	var fileContents = fileData.read().toString();
	var fileLines = fileContents.split(/\r\n|\r|\n/);

	// カラムを取得
	var tableColumns = fileLines[0].split('\t');

	// 2行目以降のデータでインスタンス化
	for (var i = 1; i < fileLines.length; i++) {
		var modelLineWords = fileLines[i].split('\t');
		var params = _.object(tableColumns, modelLineWords);
		var model = Alloy.createModel(modelName, params);
		model.save();
	}
}

ファイルの末尾に空行が入ってるとうまく動かないと思うので、
そこだけ除去してください。

上記の方法の利点はカラムが増えても、改修不要な点。
JavaScriptもさることながら、Underscore.jsがかなり使える。
Ruby on Rails 使ってる人はすぐに慣れるはず。

Titanium Mobile で整形した日付を取得する

Titanium SDK:3.2.0
Alloy:1.3.0

SQLiteではデータ型が存在しないので、text型で保存するのが定番らしい。
Alloyには日付操作ライブラリ「moment.js」が提供されているので、
それを使って、text型の日付が取得できる。

var moment = require('alloy/moment');
var now = moment() // これで現在日付が取得可能。
var foematedNow = now.format("YYYY-MM-DD HH:mm:ss");

console.log(foematedNow); // 2014-01-21 20:01:87

SQLiteの関数 date(), time(), datetime() の書式に合わせるのが、良いらしいので、
上記ではdatetime()の書式に合わせて、記述しました。
これでソートもうまく出来るそうな。(未検証)

【参考にしたサイト】
Alloyの公式ドキュメントによるmoment.jsの説明
http://docs.appcelerator.com/titanium/latest/#!/api/Alloy.builtins.moment

moment.jsの公式サイト
http://momentjs.com/