package com.example.wordbook.task; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.util.Log; import android.util.TimingLogger; import com.example.wordbook.common.Common; import com.example.wordbook.common.Message; import com.example.wordbook.provider.WBData; import com.example.wordbook.provider.WBHelper; import com.example.wordbook.provider.WBProvider; /** * 単語帳DB問題集出力タスク */ public class AsyncTaskExport extends AsyncTaskBase { /** TAG */ private static final String TAG = AsyncTaskExport.class.getSimpleName(); /** * コンストラクタ * * @param activity * アクティビティ * @param horizontal * 水平進捗バー表示設定 */ public AsyncTaskExport(Activity activity, boolean horizontal) { super(activity, horizontal); } /* * (非 Javadoc) * * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { super.onPreExecute(); Log.d(TAG, "onPreExecute()"); } /* * (非 Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Integer result) { // 処理成功 if (result > 0) { // 成功通知 Message.show(mActivity, Message.ID.EXPORT_COMPLETE); } else { // 失敗通知 Message.show(mActivity, Message.ID.EXPORT_FAILED); } Log.d(TAG, "onPostExecute()=" + result); super.onPostExecute(result); } /* * (非 Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Integer doInBackground(String... params) { Log.d(TAG, "doInBackground()"); int result = 0; // パラメータ取得 String data = ""; if (params == null || params.length == 0) { return result; } data = params[0]; // インデックス取得 int index = 0; // データ数取得 int data_max = 0; List> list = Common.getWordbookPrefList(mActivity .getApplicationContext()); for (Map item : list) { if (item.get(Common.WORDBOOK_TITLE).equals(data)) { index = (Integer) item.get(Common.WORDBOOK_INDEX); data_max = (Integer) item.get(Common.WORDBOOK_COUNT); break; } } if (index == 0) { return result; } if (data_max == 0) { return result; } // Indexの問題集出力 final int DB_MODE = 1; TimingLogger logger = new TimingLogger("dbg", "Export()"); // 出力ファイルパス final String path = Common.WORDBOOK_DIRECTORY + data + Common.WORDBOOK_OUT_SUFFIX + Common.WORDBOOK_EXT; // 対象設定 String selection = WBData.InfoColumns.INFO_FILE + "=?"; String[] selectionArgs = { Integer.toString(index) }; Cursor c; int idx_level, idx_flag, idx_ok, idx_ng, idx_q, idx_a, idx_d1, idx_d2; FileOutputStream fos = null; OutputStreamWriter osw = null; PrintWriter pw = null; try { fos = new FileOutputStream(path); osw = new OutputStreamWriter(fos, "UTF-8"); pw = new PrintWriter(osw); // プログレスバー設定 final int STEP = 20; int data_step = data_max / STEP; publishProgress(0, data_max); switch (DB_MODE) { case 0: // by ContentProvider ContentResolver cr = mActivity.getContentResolver(); Uri uri = WBProvider.INFO_CONTENT_URI; c = cr.query(uri, null, selection, selectionArgs, null); idx_level = c.getColumnIndex(WBData.InfoColumns.INFO_LEVEL); idx_flag = c.getColumnIndex(WBData.InfoColumns.INFO_FLAG); idx_ok = c.getColumnIndex(WBData.InfoColumns.INFO_OK); idx_ng = c.getColumnIndex(WBData.InfoColumns.INFO_NG); idx_q = c.getColumnIndex(WBData.InfoColumns.INFO_QUESTION); idx_a = c.getColumnIndex(WBData.InfoColumns.INFO_ANSWER); idx_d1 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA1); idx_d2 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA2); while (c.moveToNext()) { pw.println(getExportString(c, idx_level, idx_flag, idx_ok, idx_ng, idx_q, idx_a, idx_d1, idx_d2)); // プログレスバー更新 if (++result >= data_step) { publishProgress(result); data_step += data_max / STEP; } } c.close(); logger.addSplit("ContentProvider"); break; default: // by SQLiteOpenHelper WBHelper helper = WBHelper.getInstance(mActivity); SQLiteDatabase db = helper.getReadableDatabase(); c = db.query(WBData.TABLE_NAME_INFO, null, selection, selectionArgs, null, null, null); idx_level = c.getColumnIndex(WBData.InfoColumns.INFO_LEVEL); idx_flag = c.getColumnIndex(WBData.InfoColumns.INFO_FLAG); idx_ok = c.getColumnIndex(WBData.InfoColumns.INFO_OK); idx_ng = c.getColumnIndex(WBData.InfoColumns.INFO_NG); idx_q = c.getColumnIndex(WBData.InfoColumns.INFO_QUESTION); idx_a = c.getColumnIndex(WBData.InfoColumns.INFO_ANSWER); idx_d1 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA1); idx_d2 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA2); while (c.moveToNext()) { pw.println(getExportString(c, idx_level, idx_flag, idx_ok, idx_ng, idx_q, idx_a, idx_d1, idx_d2)); // プログレスバー更新 if (++result >= data_step) { publishProgress(result); data_step += data_max / STEP; } } c.close(); db.close(); helper.close(); logger.addSplit("SQLiteOpenHelper"); break; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } finally { try { if (pw != null) { pw.close(); } if (osw != null) { osw.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } // 処理時間計測 logger.dumpToLog(); return result; } /** * 出力用文字列生成 * * @param c * 解析対象カーソル * @param idx_level * ColumnIndex:Level用 * @param idx_flag * ColumnIndex:Flag用 * @param idx_ok * ColumnIndex:OK用 * @param idx_ng * ColumnIndex:NG用 * @param idx_q * ColumnIndex:Question用 * @param idx_a * ColumnIndex:Answer用 * @param idx_d1 * ColumnIndex:Data1用 * @param idx_d2 * ColumnIndex:Data2用 * @return 出力用文字列 */ private String getExportString(Cursor c, int idx_level, int idx_flag, int idx_ok, int idx_ng, int idx_q, int idx_a, int idx_d1, int idx_d2) { // CSV形式 StringBuilder sb = new StringBuilder(); sb.append(Integer.toString(c.getInt(idx_level))); sb.append(","); sb.append(Integer.toString(c.getInt(idx_flag))); sb.append(","); sb.append(Integer.toString(c.getInt(idx_ok))); sb.append(","); sb.append(Integer.toString(c.getInt(idx_ng))); sb.append(","); sb.append(c.getString(idx_q)); sb.append(","); sb.append(c.getString(idx_a)); sb.append(","); sb.append(c.getString(idx_d1)); sb.append(","); sb.append(c.getString(idx_d2)); return sb.toString(); } }