たけぼーの備忘録

暇を持て余した人間の無意味なブログ

Androidでデータベースの作成・更新中にProgressDialogを表示する

こんにちは。
今日は久しぶりにAndroidネタです。

開発中のアプリでSQLiteを使ったデータベースを使用しているのですが、今回そのデータベースの構造自体を大きく変更する必要が出てきました。

データベースの変更には少し時間がかかる上に、その間にどこか別の場所をタップされたりなんかしたら非常に面倒です。

ということで、この更新処理中にProgressDialogを表示させることにしました。

意外と手間取りましたので、メモしておきます。

ProgressDialogとは

ProgressDialogというのは、これです。
f:id:takebo_blog:20170811172139p:plain
上の画像では少しわかりづらいですが、左にはスピナー、右にはメッセージが表示されるダイアログです。

みなさんも、どこかでご覧になったことがあると思います。
よくデータを取得するときなんかに表示されたりしますよね。

今回は、これをデータベースの準備中に表示させようと思います。

実装

実装方法は非常にシンプル。
DatabaseHelperの中に、AsyncTaskを盛り込むだけです。

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

    private Context appContext;
    private int oldVersion,newVersion;

    public DatabaseHelper(Context context){
        super(context,"database.db",null,2);
        this.appContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("テーブルの作成処理をここへ");
        db.close();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        this.oldVersion = oldVersion;
        this.newVersion = newVersion;
        new updateDB().execute(db);
    }

    public class updateDB extends AsyncTask<SQLiteDatabase,Void,Integer>{
        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            progressDialog = ProgressDialog.show(appContext,"データを更新中","この処理には少し時間がかかる場合があります");
        }

        @Override
        protected Integer doInBackground(SQLiteDatabase... params) {
            SQLiteDatabase db = params[0];
            //データベースの更新処理
            if(oldVersion == 1 && newVersion == 2) {
                db.execSQL("更新処理をここへ");
            }
            db.close();
            return 1;
        }

        @Override
        protected void onPostExecute(Integer result){
            progressDialog.dismiss();
            super.onPostExecute(result);
        }
    }
}

非同期処理の中にデータベースの更新処理を入れることで、ダイアログを表示しながら処理ができるようになります。
非同期処理を呼び出す際には、updateDB().execute()を使用します。

ポイントは、doInBackgroundの引数です。
execute()の引数がdoInBackgroundのparamsに配列として渡されます。

そのため、今回は変数dbをparams[0]に格納して受け渡ししています。

最後に

まとめてみると、とても簡単ですね。
ではまた。