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/