株式会社ライブキャストロゴ 株式会社ライブキャスト

2011年11月3日 追記
ご注意!
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;
		}

sample4

実行結果をコンソールから確認してみます。
※ 実機では、権限がないということでコンソールからの確認ができませんでしたので、とりあえずemulator上で確認しています。

macbook:~ mojamoja$ adb shell # sqlite3 data/data/jp.flashcast.translator.android/databases/
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>

これで、翻訳結果を保存するところまでできました。
次回は、その結果を閲覧する機能をつくろうと思います!

サンプルソース