1.9K Views
April 22, 22
スライド概要
XPagesDay2012 発表資料
1-A 3-A Titanium Mobileによるモバイルア プリケーションとXPages連携 ジョンソンコントロールズ(株) システムエンジニア 林 哲司
今日のテーマ • Titanium Mobile&XPagesでどんな物が作れる? • モバイルアプリケーションの開発手法比較 • Dominoでモバイル対応と言えば、UpgradePack(DojoMobile) じゃないの? • Titanium Mobile開発基礎 • JSONって? • JSONによるTitanium MobileとXPagesアプリのデータ連係
Titanium Mobile&XPagesで どんな物が作れる?
Titanium&XPagesでどんな物が作れる? DEMO
システム構成、技術構成 Server Domino Server WiFi Rooter JSChart Notes DB WiFi JSON Titanium Mobile JSChart Android SQLite DB Notes Client ClientPC
モバイルアプリケーションの開発手法
モバイルに向いているアプリ • • • • 参照もの つぶやきもの 数値、記号入力もの ゲーム(ライトな物) 通常のNotesアプリのように文書情報をがっつり入力す るのは今のところ面倒 ※手がフリックネイティブな人除く ※iPhone4Sユーザーの方はSiriを使えば出来る?? 今後はゲームのようにタップやタッチを生かした業務ア プリケーションが増えていく(はず)
モバイルアプリケーション開発の方法 • Webアプリ(HTML5&CSS3) • Webサーバー上にあるHTMLファイルを参照する • ネイティブ(Objective-C、Java) • Objective-CやJavaで記述され、モバイル端末にインストールするアプリ • ハイブリッド(JavaScript、HTML+インストール可) • HTMLやJavaScriptで記述されているが、モバイル端末にインストール可能なアプ リ TitaniumMobile DojoMobile PhoneGap HTML5+CSS3 XCode(Objective-C) jQueryMobile Java SenchaTouch Silverlight
Webアプリの特徴 • • • • • • HTML5 & CSS3 Domino UpgradePackもこれ 要ネットワーク環境 パフォーマンス低(HTTP通信が発生) iOS Android両対応可 ストア不可 • • PhoneGap:buildとか使うと出来そうだけど・・・詳しくはわかりません。 m(_ _)m 見るだけアプリならこれでOK! ちょっと凝ろうとするとたちまち面倒な事態に
ネイティブの特徴 • • • • • • Java/Objective-C スタンドアロン動作可 パフォーマンス高 端末の機能をフルに使える(カメラ、GPS、センサー) iOS Androidは個別開発 ストア可 ちょっとしたアプリでも、それなりの技術力が要 求される
ハイブリッドの特徴 • • • • • • • JavaScriptのみ(Titaniumの場合) スタンドアロン動作可 パフォーマンス中(ほぼ高) 端末の機能が使える iOS,Android両対応可 ストア可 アプリサイズはネイティブに比べると大きくなる傾向 スタンドアロン動作が必要な要件、ネイティブ機 能を簡単に呼び出したい場合はコレ!
比較表 Webアプリ 開発言語 ネイティブ HTML5/CSS3 Objective-C Java ハイブリッド JavaScript パフォーマンス 低 高 中 開発容易性 ○ × ◎ iOS、Android 両対応 ◎ × ○ 端末固有の機 能が使えるか ○ ◎ ◎ 要ネットワーク 要 不要 不要
Dominoでスマホ対応って言ったら、 UpgradePackじゃないの?
UpgradePack1によるDesignerの進化 • ドラッグ&ドロップでコンポーネントを配置してデザインできる ようになりました Mobile コントロール 大きな進歩です<( ̄^ ̄)>
でもね • アウトラインビューを使ってコンポーネントを正確に入れ子に しないといけません! • ちょっと複雑なことをしようとすると、プロパティではなく「ソー スを解析して、いじってください」ってなります • エラーになった場合には、ブラウザに何も表示されません (Domino8.5.3+UpGradePack1現在) コンポーネントは正確に入れ 子にしないといけません! (大切だから2回言いました!) 開発者はXPagesやDojo技術を極めたいわけではなく、アプリを 作りたいのです!
で作れるアプリはと言うと • UpgradePackを使ったモバイルアプリって言うと・・・ Simple is BEST! スマホ対応黎明期なデザイン
ちまたのモバイル用Webサイトは? • こんな感じ ここまでとは言わずとも、もう少しCoolにならないものか?
100歩譲って「デザインはシンプルに行き ましょう!」となった場合 • DojoMobile、UpgradePackの情報が少なすぎます • カメラ、GPS、バイブレーション、センサーなど端末の機能を 使いたい場合は?(PhoneGap?) • ローカルレプリカのような動作をさせたい場合は?(電波があ る時にローカルに一気にデータを持ってくる) • 最新のDojo1.7も使えるが、情報が少なく、Dominoにインポー トするとサポートが受けられなくなる ┐(‘~`;)┌
XPagesのモバイルアプリ開発に必要な物 1. 英語サイトを検索する力 (エキサイト先生可) 2. 試行錯誤する時間 3. 忍耐
そういう方に Titanium Mobile \(^-^)/ 高パフォーマンスなアプリを作りたい方はObjective-C/Java 簡単に業務アプリを作りたい方はTitanium
Titanium Mobile開発基礎
TitaniumMobileって? • appcelerator(アプセラレータ)が開発したJavaScriptのみで iOS&Androidアプリが開発できる開発環境 • フリーで使える(有償サポートあり) • Eclipseをベースとした統合開発環境あり • JavaScriptのみでGUIとロジックを記述する • 技術習得が簡単! • 日本語コミュニティーが充実
TitaniumMobile動作の仕組み • JavaScriptコンパイラからコードをコンパイルし、ネイティブ機 能を実行する(らしい)
Titaniumでどんなアプリが作れる?① • MogSnap-食べた物の画像とコメント をアップし、ネット上で共有、評価(食べたいな ど)を行う〈for iPhone〉 • 映画情報「myシアター」-新作 映画の紹介、予告を見たり、オンラインでチ ケットも買える〈for Android〉 • AKB前田敦子Maeda-1グランプ リ-萌えアプリ? 〈for iPhone〉
Titaniumでどんなアプリが作れる?② • サイボウズLiveクライアント -スケジュール、ファイル共有、掲示板、 ToDoリストのクライアント〈for iPhone、 Android〉
開発環境の構築(Window+Android) 1. JDK(JavaSE)をインストール 1. 2. 2. 3. 4. 5. 6. JDKは1.7系ではなく、1.6系で 64bit版Windows7の場合もJDKは32bit版で Windowsの環境変数でパスを通す Android SDKをインストール appceleratorからTitanium Studio(Eclipseベース)をダウンロード(要ユー ザー登録)して、インストール Android端末のドライバをインストールし、PCにUSBケーブルで接続 (Androidエミュレータはとにかく重い) Android端末の設定画面で「提供元不明のアプリ」を許可、開発オプショ ンの「USBデバッグ」をON Mac+iOSの方、ゴメンナサイm(_ _)m 書籍を買うか?ググってください
開発DEMO(実演) • プロジェクトの作成 • 入力画面の作り方 DEMO
Titaniumの「大変良く出来ました」 • とにかく短いコードで、パフォーマンスの高いアプリが作れる • 画面とロジックを同じJavaScriptで書けるので容易に習得で きる • 画面はXML、ロジックはJavaとかじゃない • JavaScriptなので他のJavaScriptライブラリが使える • ブラウザも呼べる • 追加モジュール(有料、無料)で拡張可能(カメラでバーコード を読むライブラリとか) AndroidとiOSのどちらのアプリも作れる! \(^-^)/
Titaniumの「頑張りましょう」① • iOSとAndroidの両対応するには、一部ロジックを変える必要 がある(そもそもOS自体の設計思想が違う) • iOSだけの機能もあります • • 開発のベースがiOSを作ってからAndroidに対応させているから仕方がない 両対応のアプリを作るのであれば、両対応しているメソッドかを確認 仕様を機能が少ないAndroid側に合わせるのも良い (ニーズを次第でiOS用、Android用のクラスを定義する必要があるかも・・・) iOSとAndroidの二つの開発環境を習得するのは大変!
Titaniumの「頑張りましょう」② • 画面の縦横比率が違う場合には工夫が必要 16:9 4:3 1280×720 960×640 960×540 854×480 15:9 800×480 480×320 ロジック用とデザイン用のコードを分離し、機種によって読込む デザインを切り替える形が妥当 Android系 iOS系
Titaniumの「頑張りましょう」③ • 書き方によって発生しないイベントなどもあるので、仕様を決 める前に単機能テストしておく必要がある(iOSでは発生する のかもしれません。)
Titaniumに関する技術情報 • 書籍「TitaniumMobileで開発するiPhone/Androidアプリ」 北尾雅人著 翔泳社 • • • これ1冊でほぼカバーできる APIのリファレンスにAndroidのみ、iOSのみの表記あり 実機で動くかどうかをテストしていくのは現実的ではない • グローバルナレッジチャンネル-Appcelerator Titanium Mobile ご紹介セ ミナー(USTREAM) • http://www.ustream.tv/recorded/16861889 • どっといんすとーる-Titanium Mobileの基礎 (全28回) • オススメ❤ http://dotinstall.com/lessons/basic_titanium • 仕組みがわかるスライド(Appceleratorの日本人社員@masuidrive作成) • http://public.iwork.com/document/ja/?d=TItanium_Mobile_Workshop_2011_47_02_47_16 .key&a=p278287629 • 連載 :Titanium Mobileで作る! iPhone/Androidアプリ • http://gihyo.jp/dev/serial/01/titanium
JSON(ジェイソン)って?
JSONとは • JavaScript Object Notationの略 • XMLなどと同様のテキストベースのデータフォーマット • Ajax開発でデータ交換フォーマットとしてよく利用される AjaxはAsynchronous JavaScript + XMLの略 • XMLと比べると簡潔で人間が理解しやすい(フィールド名、値、 配列などが明確) ■XMLの例 フィールド名 値 <children> <child> <name>綾波レイ</name> <machine>零号機</machine> </child> <child> <name>式波アスカラングレー</name> <machine>弐号機</machine> </child> </children> ■JSONの例 フィールド名 値 [ { “name”:”綾波レイ”, “machine”:”零号機”, }, { “name”:”式波アスカラングレー”, “machine”:”弐号機”, } ]
JSONの記述方法 ■オブジェクト { "プロパティ1 " : 値1, "プロパティ2 " : 値2 } ■配列 [ "項目1 " , "項目2 " ] 中括弧{}で全体を囲み、プロパティ名(Notesだとフィールド 名)と値をコロンで区切る 複数値データの場合には、カンマで区切る 大括弧で囲い、項目と項目はカンマで区切る ■オブジェクトと配列のネスト {"children":[ {"name":"綾波レイ","age":14}, {"name":"碇シンジ","age":14}, {"name":"式波アスカラングレー ","age":14} ]} ノーツで言うとオブジェクト1つで1文書 所詮ただのテキスト!怖れることはない!
Notesの文書だと • JSON形式で文書を出力するXPagesを作成します • 呼出し方法は普通にURLでXPagesを呼び出す http://xpages/jsonhttp.nsf/download.xsp ■出力結果 {"entries":[ {"Field01":"零号機","Field02":"綾波レイ"}, {"Field01":"初号機","Field02":"碇シンジ"}, {"Field01":"2号機","Field02":"式波アスカラングレー "}, {"Field01":"6号機","Field02":"渚カヲル"} ]}
DominoUpgradePackではJSON形式で
出力できるんじゃなかった?
• できます(Dominoデータサービス)
■出力結果(一部を抜粋)
[
{ "@href":"http:¥/¥/xpages:80¥/jsonhttp.nsf¥/api¥/data¥/collections¥/name¥/jsontestvw¥/unid¥/5B49802
D91867C00492578D60017CC58",
"@link":
{
"rel":"document",
"href":"http:¥/¥/xpages:80¥/jsonhttp.nsf¥/api¥/data¥/documents¥/unid¥/5B49802D91867C00492578D60017
CC58"
},
"@entryid":"1-5B49802D91867C00492578D60017CC58",
"@unid":"5B49802D91867C00492578D60017CC58",
"@noteid":"8F6",
"@position":"1",
"@siblings":4,
2バイト文字はエンコードされています
"@form":"TestFrm",
←零号機
"Field01":"¥u96F6¥u53F7¥u6A5F",
←綾波レイ
"Field02":"¥u7DBE¥u6CE2¥u30EC¥u30A4"
},
個人的には自前でコードを書いた方がシンプルでわかりやすい
と思います
Dominoデータサービスの使い方 1. サーバー文書-インターネットプロトコル-DominoWebEngine-Domino アクセスサービスの「有効なサービス」に“データ | Data”と入力 2. Webサイト文書-設定-Dominoアクセスサービスの「有効なサービス」 に“データ | Data”と入力 3. データベースのプロパティ-詳細タブ-LotusDominoデータサービスを 許可に“ビューのみ”or”ビューと文書”のどちらかを選択 4. ビューのプロパティ-詳細タブ-Webアクセス-LotusDominoデータサー ビスの操作を許可にチェックをつける 5. ビューからのデータ出力の場合、下記のようなURLを指定 http://{host}/{database}/api/data/collections/name/{viewname} ※2のWebサイト文書は設定しなくても動作する 【IBMサポート技術情報】 日本語版 Lotus Domino で Domino データサービス (DDS) が利用できない http://www-01.ibm.com/support/docview.wss?uid=swg21587846
JSONってどう使えるの?何が便利? • XMLに比べてデータ量が少ない(サンドイッチしなくて良い) • JavaScriptのevalを使うと、LotusScriptのDocumentクラスの ようにデータを扱える • JSON.parseがある場合は、セキュリティリスク(クロスサイトスクリプティング) を考慮してJSON.parseを使って下さい • evalは文字列を式として評価する関数です
JSONによるTitanium MobileとXPagesアプ リのデータ連係
Dominoとのデータ交換(前準備) • サーバー側ロジックはXPagesで記述します • 新規のXPagesを作成し、「すべてのプロパティ-rendered」 に”false”を設定 • コードはサーバーサードスクリプトの「afterRenderResponse」 イベントに記述 普通の地球人にはわかりません! 神様であるIBM佐藤さんのチームに教えていただきました
Dominoとのデータ交換(Download①)
サーバー側コード(XPages-JavaScript)
//レスポンスのContentType、Cache-Controlヘッダを指定
var response = facesContext.getExternalContext().getResponse();
response.setContentType("text/plain");
response.setHeader("Cache-Control","no-cache");
//ResponseWriterにデータを書きだす(書き出すデータは関数で生成)
var writer= facesContext.getResponseWriter();
writer.append(listViewEntries());
writer.flush();
writer.endDocument();
doc.recycle();
entry = entries.getNextEntry();
}
entries.recycle();
vw.recycle();
db.recycle();
return ‘{“entries”:[¥n¥t’ + viewArray.join(‘,¥n¥t’)+’¥n]}’;
}
//JSONデータ出力関数
function listViewEntries(){
var viewArray = new Array();
var
var
var
var
db:NotesDatabase
= session.getDatabase(@Subset(@DbName(), 1),@Subset(@DbName(), -1));
vw:NotesView
= db.getView("TestVw");
entries:NotesViewEntryCollection = vw.getAllEntries();
entry:NotesViewEntry = entries.getFirstEntry();
while(entry){
var doc:NotesDocument = entry.getDocument();
var array= new Array();
array.push('Field01:"' + doc.getItemValueString("Field01")+'"');
array.push('Field02:"' + doc.getItemValueString("Field02")+'"');
viewArray.push("{"+array.join(",")+"}");
後でソースは公開します
Dominoとのデータ交換(Download②)
サーバー側コード(XPages-JavaScript)
<呪文省略>
function listViewEntries(){
var viewArray = new Array();
Notesクラスを指定すると
コードの補完機能が働く
出力されるJSON配列を作成
var db:NotesDatabase = session.getDatabase(@Subset(@DbName(), 1),@Subset(@DbName(),
-1));
データベースを開く
var vw:NotesView = db.getView("TestVw");
ビューを開く
var entries:NotesViewEntryCollection = vw.getAllEntries();
ビューエントリーを取得する
var entry:NotesViewEntry = entries.getFirstEntry();
while(entry){
var doc:NotesDocument = entry.getDocument();
var array= new Array();
array.push(‘"Field01":"' + doc.getItemValueString("Field01")+'"');
array.push('"Field02":"' + doc.getItemValueString("Field02")+'"');
viewArray.push("{"+array.join(",")+"}");
doc.recycle();
entry = entries.getNextEntry();
}
entries.recycle();
vw.recycle();
db.recycle();
return "{entries:[¥n¥t" + viewArray.join(',¥n¥t')+'¥n]}';
}
エントリーがなくなるまでLoop
データの中身用配列を作成
配列にフィールド名、値をPush
出力用配列に中身用配列を
Push
JSON形式で出力
Dominoとのデータ交換(Download③)
クライアント側コード(Titanium Mobile-JavaScript)
btnDownload.addEventListener('click', function()
{
//HTTPオブジェクト作成
var xhr
= Ti.Network.createHTTPClient();
xhr.open('GET','http://192.168.1.1/jsonhttp.nsf/download.xsp?OpenXPage');
//レスポンス受取イベント定義
xhr.onload = function(){
var json
= JSON.parse(this.responseText);
var pos;
for( pos=0; pos < json.entries.length; pos++){
alert(json.entries[pos].Field01+'¥n'+
json.entries[pos].Field02);
NotesDocumentの
};
};
//リクエスト送信
xhr.send();
});
doc.Field01に近い
通信オブジェクトを作成
URLを指定(GET)
受け取ったレスポンスを
JSONオブジェクトに変換
ループ
リクエスト送信
Dominoとのデータ交換(Upload①)
サーバー側コード(XPages-JavaScript)
//POSTされたリクエストを読み込み
var request = facesContext.getExternalContext().getRequest();
if("POST"==request.getMethod()){
try{
var stream
= request.getInputStream();
var out
= new java.io.ByteArrayOutputStream();
var buf
= new byte[1024];
var num;
while((num = stream.readLine(buf,0,1024))!=-1){
out.write(buf,0,num);
}
//POSTされたJSON形式文字列をJSONオブジェクトに変換
var data
= eval("(" + out.toString("UTF-8") + ")");
//POSTされたデータから文書を作成し、戻り値をResponseWriterに
データ書き出し
var writer
= facesContext.getResponseWriter();
writer.write(createEntry(data));
writer.flush();
文書作成の本体はこ
writer.endDocument();
の自作関数
}catch(e){
print(e);
}
}
HTTPリクエスト受取
<呪文>
UTF-8でデコードして変換
createEntry関数にデコードし
たデータを引き渡し
Dominoとのデータ交換(Upload②)
サーバー側コード(XPages-JavaScript)
//POSTされたデータから文書を作成
function createEntry(data){
if(data){
var db:NotesDatabase = session.getDatabase(@Subset(@DbName(), 1),@Subset(@DbName(), -1));
var doc:NotesDocument = db.createDocument();
文書作成
doc.replaceItemValue("Form","TestFrm");
doc.replaceItemValue("Field01",data.Field01);
doc.replaceItemValue("Field02",data.Field02);
doc.computeWithForm(true,false);
doc.save();
//Notesオブジェクトを解放
var documentid = doc.getUniversalID();
doc.recycle();
db.recycle();
//作成した文書のUniversalIDを返す
return "{status: ¥"success¥",documentid:¥"" + documentid + "¥"}";
}else{
return "{status:¥"error¥"}";
}
}
フォーム指定
フィールドに値を書込
文書再計算
保存
Notesオブジェクトを解放
文書IDを返す
(別に返さなくてもよい)
Dominoとのデータ交換(Upload③)
クライアント側コード(Titanium Mobile-JavaScript)
btnUpload.addEventListener('click', function()
{
//HTTPオブジェクト作成
var xhr
= Ti.Network.createHTTPClient();
xhr.open('POST','http://192.168.1.1/jsonhttp.nsf/upload.xsp?OpenXPage');
//レスポンス受取イベント定義
xhr.onload = function(){
alert(this.responseText);
};
受け取ったレスポンスを表
示
//送信用パラメータ(登録データ)定義
var params = '{"Field01":“6号機","Field02":"渚カヲル"}';
//リクエスト送信
xhr.setRequestHeader('Content-Type','text/xml');
xhr.send(params);
});
通信オブジェクトを作成
URLを指定(POST)
送信するデータを設定
(フィールド名:値)
フィールド名と値を
JSON形式で渡す
リクエスト送信
Dominoとのデータ交換(FileUpload①) サーバー側コード(XPages-JavaScript) var extContext = facesContext.getExternalContext(); var request:javax.servlet.http.HttpServletRequest = extContext.getRequest(); if ("POST" == request.getMethod()) { //JSON形式でPOSTされたファイル、パラメータを取得 var fileData:com.ibm.xsp.http.UploadedFile = request.getParameterMap().get("fileobj"); var tmpFile:java.io.File = fileData.getServerFile(); var fileName = request.getParameter("filename"); var field01 = request.getParameter("field01"); var field02 = request.getParameter("field02"); //一時ファイルとしてアップロードされた画像を元のファイル名をつけ、移動 var correctedFile = new java.io.File( tmpFile.getParentFile().getAbsolutePath() + java.io.File.separator + fileName ); var success = tmpFile.renameTo(correctedFile); //パラメータで渡された点検日時、ポイントIDからデータ文書を特定 var doc:NotesDocument = database.createDocument(); doc.replaceItemValue("Form", "TestFrm"); doc.replaceItemValue("Field01", field01); doc.replaceItemValue("Field02", field02); 添付ファイル取得 一時ファイル取得 パラメータ(フィールド)取得 一時ファイルに元のファイ ル名をつけ移動 文書作成 フィールド書込 〃 〃
Dominoとのデータ交換(FileUpload②)
サーバー側コード(XPages-JavaScript)
<続き>
var fileRichText:NotesRichTextItem = doc.getFirstItem("ImageBody");
if (fileRichText == null){
var fileRichText:fileRichText = doc.createRichTextItem("ImageBody");
}
//リッチテキストフィールドにファイルを添付
fileRichText.embedObject(1454, "", correctedFile.getAbsolutePath(), null);
//画像ファイルを一時ファイルにリネーム(削除はOSのキャッシュ削除に任せる)
correctedFile.renameTo(tmpFile);
doc.save();
var documentid = doc.getUniversalID();
doc.recycle();
}
リッチテキストアイテム取
得
ファイル添付実行
//
文書保存
Dominoとのデータ交換(FileUpload③)
クライアント側コード(Titanium Mobile-JavaScript)
btnFileUpload.addEventListener('click', function()
{
Ti.Media.openPhotoGallery({
//PhotoGallery:選択時の動作
success: function(event) {
var image;
選択した画像を取得
image
= event.media;
//選択した画像を取得
画像ファイルパス取得
var filePath = image.nativePath;
画像ファイル名取得
var fileName = filePath.substring(filePath.lastIndexOf('/')+1);
//HTTPオブジェクト作成
HTTPオブジェクト作成
var xhr
= Ti.Network.createHTTPClient();
URL指定
xhr.open('POST','http://192.168.1.1/jsonhttp.nsf/httpfileupload.xsp?OpenXPage');
//HTTPリクエスト送信
画像ファイル、フィールドな
xhr.send({fileobj:image,filename:fileName,field01:‘3号機’,field02:‘鈴原トウジ'}); どをJSON配列で送信
},
// PhotoGallery:キャンセル時の動作
cancel: function() {
return false;
},
// PhotoGallery:選択可能なメディア種別を配列で指定
mediaTypes:[Ti.Media.MEDIA_TYPE_PHOTO],
});
}
おまけ IBMさんへの要望
要望①:最新版での体系的な開発情報 • Domino8.5.3+UpgradePackをベースとしたXPagesを 体系的に学べる日本語の情報を出して下さい • 初期のXPagesとUpgradePack付きではかなり開発環境が変わっ てしまいました • ググると古いOneUIの作り方(複雑にコントロールを配置するか? 意味不明のソースと格闘)が出てきたり・・・ 【@IT】XPagesでLotus Notes/Dominoアプリ開発入門(1) http://www.atmarkit.co.jp/fjava/rensai4/xpages01/01.html 5/11 IBM佐藤さん連載開始 期待してます! (UpgradePackのリファレンスも作って下さいね。何ができるコンポーネントか?)
要望②:リファレンスにはサンプルコードを • XPagesのリファレンスにサンプルコードをつけて欲しい • 技術セミナーは動画でUstreamやニコニコ動画で配信して欲 しい • 1000円以下なら有料でも良いです
要望③:一番欲しい物・・ • でもやっぱり今、一番欲しいのは・・・ XPagesアプリをアップできるLotusLiveを 課金システム付きで構築して欲しい 今すぐ!
ありがとうございました • 本日はご清聴ありがとうございました ミ★(*^-゚)v Thanks!!★彡
付録:Titaniumコーディング Tips① • ソースコード内に配置したSQLiteDBを読み込むには下記のコードで読み 込む var db= Ti.Database.install('db/database.db',‘database1'); • • • 一度読み込むと、内蔵メモリに読み込まれ、再度同じコード実行された場 合には、メモリ内DBが優先される 再度ソース内DBを開くには、メモリ内DBを削除するか、アプリ自体をアン インストールする必要がある ソースが正しいのにDBを読み込めない場合には、メモリ内DBを削除して みる db.remove(); インストールするとコピーされ、メモリ内DBが開かれる ソース内 DB メモリ内 DB
付録:Titaniumコーディング Tips② • メモリ内DBをSDカードに出力するには下記のように記述する //メモリ上にコピーされたデータベースファイルを取得 var dbDir= 'file:///data/data/' + Ti.App.getID() + '/databases/'; var dbFile= Ti.Filesystem.getFile( dbDir + ‘database1' ); //SDカード上のSQLiteDBを取得 var sdDir= Ti.Filesystem.getFile(Ti.Filesystem.externalStorageDirectory); var sdFile = Ti.Filesystem.getFile(sdDir.nativePath + '/', ‘database.db'); //ファイルをコピー var resources =dbFile.read(); sdFile.write(resources);
付録:Titaniumコーディング Tips③
•
アプリをSDカードにインストール可能にするには、Titaniumプロジェクトの
設定ファイルであるtiapp.xmlのソースに下記の項目を追加する
<!--SD Cardへのインストール許可(Android2.2(API Ver8)以降)-->
<android xmlns:android="http://schemas.android.com/apk/res/android">
<tool-api-level>8</tool-api-level>
<manifest android:installLocation="auto">
<uses-sdk android:minSdkVersion="7"/>
</manifest>
</android>
•
SONY MobileのXperiaはカメラアプリの作り込みが特殊なので、呼出方を
工夫する必要がある