ご注意!
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:ダウンロード
