2011年11月11日金曜日 0 コメント

データベースが壊れた!?

SQLite データベースを使ったアプリを開発中、いきなりデータベースが開けなくなった。
そこにはこんなエラーメッセージが
android.database.sqlite.SQLiteDatabaseCorruptException:database disk image is malformed
データベース ファイルが不正だと怒られました。
使用しているデータベースは内部で生成したものではなく、
「Resources」フォルダ内にあるSQLiteデータベース ファイルを利用している。

いろいろ調べて試してみたが、相変わらずエラーが・・・
(SQLite コマンドで一度データベースを開いて、SELECT文を実行するなど)

仕方なくデータベース ファイルを作り直してファイルを差し替えた。
するとエラーが出なくなり、データにアクセスできるようになった。
ついさっきまで動いてたのに、・・・一体何が原因だったんだろう。
2011年11月4日金曜日 0 コメント

画面が表示されたときに処理を実行する

<!Android の場合>
window の open イベントでは、最初に画面が表示されたときしかイベントが発生しない。
初期表示時だけでなく、他の画面から表示を切り替えたときなどにも処理を行いたい場合は、Titanium.Android.currentActivity の resume イベントを利用する。 resume イベントは現在のアクティビティが再開されたときに発生する。
Titanium.Android.currentActivity.addEventListener('resume', function(){
   // 画面の更新処理を呼び出す
   updateDetails();
});
0 コメント

Picker のクリア(値の削除)

Picker の値をクリア(削除)するには、Picker からクリアする行を含む列(column)を取り出し、 取り出した列に含まれる行(row)をループ処理で取り除いていく。
var _col = picker.columns[0];  // クリアする列を取得
if(!_col) return;
var len = _col.rowCount;
for( var x = len - 1; x >= 0; x-- ) {
   var _row = _col.rows[x];
   _col.removeRow(_row);
}
picker.reloadColumn(_col);   // 行の更新
2011年9月21日水曜日 0 コメント

Tabを使わない画面遷移

TabGroup(Tab)を使わずwindow.open()だけで画面を移動させると、 2つ以上の画面を開いている状態でも(Androidで)バックボタンを押すとアプリが終了してしまう。
それを回避するには、windowのexitonCloseプロパティを使用する。
// ルートウィンドウ
// この画面でバックボタンを押すと、アプリが終了する
var win1 = Titanium.UI.createWindow({
  title: 'ルートウィンドウ',
  fullscreen: false,
  exitonClose: true
});

// ルートウィンドウの次に表示するウィンドウ
// この画面でバックボタンを押すと、アプリは終了せず前の画面に戻る
var win2 = Titanium.UI.createWindow({
  title: '次のウィンドウ',
  fullscreen: false,
  exitonClose: false
});
2011年6月6日月曜日 0 コメント

iOSで動かす際の注意

Titaniumを使ってAndroid用に作成したアプリを、iOSシュミレータで動かしたときに表示がおかしくなってしまった。
そのとき気づいた点をまとめてみた。

  • 「boarderStyle」を設定しないと枠線が表示されない。
  • 「layout」が設定されているWindow やView を使用した場合、中に配置するUIには「height」をしておく(省略すると画面に表示されない)。
  • Picker の「width」に'auto'を指定すると、表示はされるが動かない。
  • (TextFieldなどの)入力フィールドを設ける場合、キーボードで隠れてしまうのを防ぐため、ScrollView を使うと良い。
2011年4月11日月曜日 0 コメント

モジュール(module)の作成

Titaniumに用意されていない機能を使いたいとき、モジュールを作ることで機能を追加することができる。
MACでのモジュール作成方法は他でも多数紹介してあるので、ここではWindowsでの作成手順についてまとめてみる。
詳しくは「Titanium Android Module Developer Guide」をみてください。

1.環境設定
[スタート]メニューから"コンピュータ"の上で右クリック、[プロパティ]‐[システムの詳細設定]タブの下の方にある「環境変数」を開く。
[PATH]を選択し「編集」またはダブルクリックし下記を追加。(なければ新規作成)
  • Windws Vista または Windows 7
     C:\ProgramData\Titanium\mobilesdk\win32\1.6.1
  • Windows XP
     C:\Documents and Settings\All Users\Application Data\Titanium\mobilesdk\win32\1.6.1

2.動作確認
コマンドラインを開きtitaniumコマンドを実行し、以下のような出力がされることを確認。
> titanium
Appcelerator Titanium
Copyright (c) 2010 by Appcelerator, Inc.

commands:
create - create a project
run - run an existing project
emulator - start the emulator (android)
help - get help

3.モジュール用のプロジェクトを作成
コマンドラインから下記のコマンドを入力し、プロジェクトを作成する。
> titanium create --platform=android --type=module --name=mymodule --id=com.example.mymodule --android=C:\app\android-sdk-windows

--name:モジュール プロジェクト名
--id:モジュール プロジェクトID
--android:Android SDK のパス
作成に成功した場合、カレントディレクトリにモジュール プロジェクトが出来上がる。

4.モジュール プロジェクトのビルド
コマンドラインからビルドするモジュール プロジェクトのディレクトリに移動し、antコマンドを実行する。
> cd /mymodule
> ant
Buildfile: C:\\ … \Titanium\mobilesdk\win32\1.6.1\mymodule\build.xml

init:
[mkdir]Create dir:C:\\ … \Titanium\mobilesdk\win32\1.6.1\mymodule\dist
  ・
  ・
  ・
BUILD SUCCESSFUL
Total time: 1 second
実行すると、モジュール プロジェクト内に「disk」フォルダが作成される。

5.アプリにモジュールを組み込む
アプリのプロジェクトホーム直下に「modules」フォルダ(なければ作成)の下に「Disk」フォルダ内のモジュールID名のフォルダをコピーする。
tiapp.xmlを開き下記を追加。
<android xmlns:android="http://schemas.android.com/apk/res/android">
</android>
<modules>
  <module version="0.1">com.example.mymodule</module>
</modules>


versionには組み込むモジュールのバージョンを指定する。

モジュールの関数を使用する場合は、app.jsなどでrequire()を使用しモジュールを呼び出し使用する。
var mymodule = require('com.example.mymodule');
Ti.API.info("call module method: " + example() );
0 コメント

JARファイルからソースを取り出す

コマンドラインから
cd jarファイルのパス
jar xf xxxx.jar
実行すると、JARファイルの中のすべてのファイルが取り出せる。
また、
jar xf xxxx.jar yyyy.java
jar xf xxxx.jar zzzz.class
とすると、指定したファイルだけが取り出せる。
 
;