ご注意!
Google Translate API v1が2011年12月1日にサービスが終了いたします。添付のサンプルソースでは、Google Translate API v1を利用していますので、翻訳が正常に機能しない場合がございます。ご承知おきください。
Android Market公開を目指してAndroidアプリを開発する!(Tweet機能実装編)の続きです。
今回はAndroid Market公開を目指してAndroidアプリを開発する!(翻訳機能実装編)の翻訳結果を保存する機能を実装したいと思います。
保存先にはSQLiteを利用します。
AndroidアプリでSQLiteを利用する方法については、こちらを参考にさせていただきました。
Java/Android/基礎編/SQLite | PukiWiki
SQLiteOpenHelper | Android Developersというクラスを使うと、データベースアクセスの実装を容易にしてくれます。
例えば、、、
- データベースやテーブルが存在しなかった時に生成してくれる処理(今回は、翻訳結果を保存するテーブルを作成するようにしました)
- データベースやテーブルが存在した場合で、バージョンが変更されている時の処理(今回は、この部分は実装しませんでした)
これらの関数が抽象メソッドとして用意されており、オーバライドすれば良いだけなので、非常に便利です。
ということで、SQLiteOpenHelperを継承した以下のようなクラスを作成しました。
package jp.flashcast.translator.android.manager; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.BaseColumns; public class ConnectionManager extends SQLiteOpenHelper { private static final String DATABASE_NAME = "translator.db"; private static final int DATABASE_VERSION = 1; private static ConnectionManager connection; public ConnectionManager(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public static ConnectionManager getInstance(Context context) { if (connection == null) { connection = new ConnectionManager(context); } return connection; } @Override public void onCreate(SQLiteDatabase db) { final String histories = "CREATE TABLE IF NOT EXISTS histories (" + BaseColumns._ID + " INTEGER PRIMARY KEY, " + "original TEXT, " + "translated TEXT, " + "srclanguage TEXT, " + "dstlanguage TEXT, " + "dt TEXT);"; db.execSQL(histories); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
次に、翻訳結果を保存するテーブルのフィールド名を定義しただけのクラスインターフェイスを作成しました。
package jp.flashcast.translator.android.schema; public interface ITranslate { String TABLE_NAME = "histories"; String ID = "id"; String ORIGINAL = "original"; String TRANSLATED = "translated"; String SRC_LANGUAGE = "srclanguage"; String DST_LANGUAGE = "dstlanguage"; String DATE_TIME = "dt"; }
続いて、デザインパターンのData Access Object(DAO)となるクラスを作成します。
package jp.flashcast.translator.android.dao; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import jp.flashcast.translator.android.manager.ConnectionManager; import jp.flashcast.translator.android.model.TranslateModel; import jp.flashcast.translator.android.schema.ITranslate; public class TranslateDao { private ConnectionManager connection; public TranslateDao(Context context) { if (connection == null) { connection = ConnectionManager.getInstance(context); } } public void insert(TranslateModel model) { SQLiteDatabase db = connection.getWritableDatabase(); db.insertOrThrow(ITranslate.TABLE_NAME, null, setValues(model)); db.close(); } private ContentValues setValues(TranslateModel model) { ContentValues values = new ContentValues(5); values.put(ITranslate.ORIGINAL, model.getOriginal()); values.put(ITranslate.TRANSLATED, model.getTranslated()); values.put(ITranslate.SRC_LANGUAGE, model.getSrcLanguage()); values.put(ITranslate.DST_LANGUAGE, model.getDstLanguage()); values.put(ITranslate.DATE_TIME, model.getDt()); return values; } }
ここでは、今までも使っていたTranslateModelというモデルクラスをData Transfer Object(DTO)としています。クラス名の命名がちょっと微妙な気がしますが(本当はTranslateDtoとか?)、役割は同じなので、あまり気にしないことにしました。
最後に、翻訳処理の後処理の部分で、翻訳結果をinsertするようにしておしまいです。
if (translating) { if (gmodel.isSuccess()) { dao.insert(gmodel); ((EditText)findViewById( (!((ToggleButton)findViewById(R.id.vector)).isChecked()) ? R.id.dsttext : R.id.srctext)) .setText(gmodel.getTranslated()); } else { Toast.makeText(this, "Failed to translate...", Toast.LENGTH_SHORT).show(); } translating = false; }
実行結果をコンソールから確認してみます。
※ 実機では、権限がないということでコンソールからの確認ができませんでしたので、とりあえずemulator上で確認しています。
translator.db
SQLite version 3.5.9
Enter “.help” for instructions
sqlite> select * from histories;
1|hungry |飢えた|en|ja|2010 6 28 23:08:10
2|journal |ジャーナル|en|ja|2010 6 28 23:09:03
3|various |さまざまな|en|ja|2010 6 28 23:09:32
sqlite>
これで、翻訳結果を保存するところまでできました。
次回は、その結果を閲覧する機能をつくろうと思います!
サンプルソース
- TranslatorSample4:ダウンロード