2011年09月26日

androidでSQLite周りでハマったことのメモ。-aBatisを使おうとしてみた。

Androidの実装をしていて、普通にSQLiteを使う場面がやってきました。色々調べたわりに実装が進まなかったので、メモしておきます。

色々調べてみましたが、みんな標準のライブラリ(SQLiteOpenHelper ?)を使っている人が多いようです。
webアプリでHibanateやiBatis(今はMyBatisというっぽい)は使ったことがあるので、CRUDの処理に関しては、
自動生成でやってほしいと思い少々調べてみました。

それで、iBatisは経験があり使いやすそうだったので探してみるとaBatisというものを見つけました。
http://code.google.com/p/abatis/

説明を見てみると、※下記引用
aBatis is a data mapper framework available for Android 
 that couples objects with stored procedures or 
 SQL statements using an XML descriptor or annotations.
aBatis is like an Android equivalent of iBatis.
となっていて、なるほどAndroid用に最適化されたmyBatisかと思ったら、
本家はあまり関係ないっぽいです。。。で使ってみた感想は、、まだまだ開発段階だなって感じです。
感想を簡単に言うと。
-MyBatisとの互換性はない。
-DBのイニシャライズでcreate分が一つしか流せない。(僕の不勉強かもしれませんが、できなかったのでここで妥協。)
-SQLのエラーが起きてもエラーを起こさず終了。(これもたまたまかも知れませんが、正しいエラーが出てこないように感じました。
-まだまだ開発中っぽいな。。。導入は簡単だったのでmyBatisをリスぺクトして頑張ってほしい。

ていう感じで、現段階でまだ使うべきではないと思った。。。


そのあと、本家のMyBatisを使おうとかspring関連調べてたら、spring-android(http://www.springsource.org/spring-android)とか色々あって目移りしてしまいました。

まぁ、軽さを考えるとデフォルトで提供されているものでいい気がしますが、
複雑になってきたらまた検討していけばいいかと思いました。
色々、出てくると思うので保留。。

*Topics
Android用のSQLiteのライブラリ等
OrmLite - Lightweight Java ORM Supports Android and SQLite http://ormlite.com/sqlite_java_android_orm.shtml
sqldroid - JDBC driver for Android's SQLiteDatabase - Google Project Hosting http://code.google.com/p/sqldroid/
Ammentos - Persistence framework http://www.ammentos.org/userguide.htm#par5

**SQLite開発時のGUIツール
色々あると思いますが、僕のおすすめはAIRで作られたLitaです。
http://www.dehats.com/drupal/?q=node/58
まだ、Androidの開発ではER図を大きく書いて、大規模な設計はしたことありませんが、
MySQLWorkbenchでplugiを入れてSQLite用に出力できるようです。←やろうとしたけど妥協しました。

**Androidにインストールされたdbファイルを閲覧するには
eclipseの場合、パースペクティブをDDMSにして、ウインドウ→ファイルエクスプローラーを開けば、
data/dataフォルダに自分で定義したパッケージの場所にファイル等があります。
ラベル:android aBatis
posted by ヤミタケ at 23:52| Comment(0) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2011年07月03日

Androidでシーケンサーっぽいものを作る。

アンドロイドの勉強中です。今回はActivityとclickHandlerの勉強をかねて、シーケンサー的なものをつくって見ました。

シーケンサーアプリはすでにたくさんあるっぽいです。↓参照
Androidで音楽制作するアプリ50選 MIDI・シーケンサーなど種類別
結構、さくさく作れて勉強していけば、色々がんばれる気がします。
あとはデザイナーさんとたくさんコラボしていきたいです。

ボタンを押下すると、それぞれに対応した音がなります。
音はあらかじめ埋め込みで/row/xxx.mp3で保存してあります。

開発中の画面は下記のような感じになります。
device-2011-07-03-222619.png


レイアウトとか色々はまり所はありそうですが、凄い洗練されている気はします。
Andoroidは解像度にあわせるためにpng画像でdip(device-independent pixel)という単位であわせていきます。

javaのソースは下記のような感じ。
package net.nyapr;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class YaprSequencerActivity extends Activity implements OnClickListener {

private Map<Integer , MediaPlayer> mpMap;
private Integer sounds[] = {R.raw.a , R.raw.b , R.raw.c ,
R.raw.d , R.raw.e , R.raw.f ,
R.raw.g , R.raw.h , R.raw.i
};
private Integer buttons[] = {R.id.button1, R.id.button2 , R.id.button3 ,
R.id.button4 , R.id.button5 , R.id.button6 ,
R.id.button7 , R.id.button8 , R.id.button9 };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

        this.initMediapLayerMap();
        this.setOnClickListeners();

        AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        int ringVol = audio.getStreamVolume(AudioManager.STREAM_RING);
        Toast.makeText(this, "It sounds it. rigtone:"+String.valueOf(ringVol) , Toast.LENGTH_SHORT).show();
    }

    /**
     * ボタンと音がマッピングされた。
     * ハッシュマップを作る。
     */
    private void initMediapLayerMap(){
    mpMap = new HashMap<Integer, MediaPlayer>();
    int i = 0;
    for(Integer id: sounds){
    mpMap.put(buttons[i++], MediaPlayer.create(this, id));
    }
    }

    /**
     * ボタンにクリックイベントを付与する
     */
    private void setOnClickListeners(){
    for(Integer id:buttons){
        /* ボタンを取り出す */
            Button b = (Button)findViewById(id);
            b.setOnClickListener(this);
        }
    }

    /**
     * Click時にボタンにマッピングされた音を再生する。
     */
    public void onClick(View v) {
    MediaPlayer mp = mpMap.get(v.getId());
    if(mp.isPlaying()){
mp.pause();
mp.seekTo(0);
}

mp.start();
    }
}


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/logo_512x512"
    >
<LinearLayout android:id="@+id/linearLayout1"
android:layout_height="100dip"
android:layout_width="match_parent"
android:orientation="horizontal">
<Button android:text="Button1"
android:id="@+id/button1"
android:layout_height="fill_parent"
android:layout_width="fill_parent" android:layout_weight="3"></Button>
<Button android:text="Button2"
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_weight="3"></Button>
<Button android:text="Button3"
android:id="@+id/button3"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_weight="3"></Button>
</LinearLayout>
<LinearLayout android:id="@+id/linearLayout2"
android:layout_height="100dip"
android:layout_width="match_parent"
android:orientation="horizontal">
<Button android:text="Button4"
android:id="@+id/button4"
android:layout_weight="3"
android:layout_height="fill_parent"
android:layout_width="fill_parent"></Button>
<Button android:text="Button5"
android:id="@+id/button5"
android:layout_weight="3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></Button>
<Button android:text="Button6"
android:id="@+id/button6"
android:layout_weight="3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></Button>
</LinearLayout>
<LinearLayout android:id="@+id/linearLayout3"
android:layout_height="100dip"
android:layout_width="match_parent"
android:orientation="horizontal">
<Button android:text="Button7"
android:id="@+id/button7"
android:layout_weight="3"
android:layout_height="fill_parent"
android:layout_width="fill_parent"></Button>
<Button android:text="Button8"
android:id="@+id/button8"
android:layout_weight="3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></Button>
<Button android:text="Button9"
android:id="@+id/button9"
android:layout_weight="3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></Button>
</LinearLayout>
</LinearLayout>

音を鳴らす所でMediaPlayerクラスを用いたのですが、
stop()を呼んでしまうとそれ以降、音が鳴らなくなる(使用できなくなる?)
僕の英語力だといまいちわかりませんでした。
公式ドキュメントMediaPlayer
http://developer.android.com/reference/android/media/MediaPlayer.html

ソースのようにmp.pause();mp.seekTo(0);で連打された時の処理を書いています。

アンドロイドでマルチタッチ?かマルチスレッドの処理があまりのか、
二つ同時にボタンを押すことはできません。それなので、iPhoneのシーケンサーより反応が鈍く感じてしまうかも知れません。
単品のボタンなら結構連打してもちゃんと反応するので、あいまいなボタンのタッチには弱いようです。(少なくともHTC Desireは)
これからも色々作って行きます。ある程度習得してきたら、マーケットになにか出そうと思っています。


今回学んだところ。
Topics(参考リンク
-クリック処理(OnClickListenerインターフェースの実装)
http://www.javadrive.jp/android/button/index4.html
-ウィンドウタイトルバーを非表示にするには - 逆引きAndroid入門
http://www.adakoda.com/android/000155.html
-音量を取得する
https://sites.google.com/site/androidappzz/home/dev/volumesample
-MediaPlayerで音楽を再生する
http://techbooster.jpn.org/andriod/application/267/

-パーツの均等割り付け
http://muchag.undo.jp/archives/856
-メニューチュートリアル
http://www.xn--rhq6sw9f0w7aevaf9ak89m.jp/android/androidLecture/Menu/Menu.html
posted by ヤミタケ at 23:09| Comment(0) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2011年06月19日

[Android]エミュレータがうまく起動しない時の対処法 emulator: ERROR: unknown virtual device name: 'TestAvd'

windows7限定かもしれませんが、Androidのエミュレータがうまく動作しない現象が起きました。

僕も新マシンを買ったので、Android開発がしたいということで環境を整えていました。環境構築自体は、Andoroid SDKを入れて、eclipseを落としてpluginをインストールすれば終了です。

アンドロイド開発環境構築 参考サイト
http://www.javadrive.jp/android/

環境構築を終え、テストにプロジェクトを作って実行してみようと思うと下記のようなエラーがでて、
エミュレータを起動できません。
-------------------------------------------------------------------------
emulator: ERROR: unknown virtual device name: 'test'
emulator: could not find virtual device named 'test'
------------------------------------------------------------------------

エラーの内容で検索してみると、同じ現象の人がいました。
「Androidのエミュレータがavdファイルを上手く見つけてくれない件について」
http://d.hatena.ne.jp/eagle_raptor/20100107/1262831913

どうやら、windows7の初期値からマイドキュメントなどをDドライブに移したのが原因で、
エミュレータがうまくAVDファイルを見つけられないのが原因らしい。
もう移動してしまったし、なんか戻すのはいやなので元のところにシンボリックリンクを張って解決しました。

-コマンドプロンプトを起動してから下記のコマンドを打ち込む---
cd %USERPROFILE%
mklink /J .android [プロファイルの移動先]\.android   (ex:D:Users\jj\.android
-------------------------------------------------------------
ウインドウズだとジャンクションて言うのかな??とりあえずこれで無事にエミュレータが動かせます。

やっとAndroid開発に着手できる!


posted by ヤミタケ at 00:22| Comment(0) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。