2011年9月3日土曜日

最新の定義情報をアプリへ反映させるコードスニペット

 

今作っているアプリで「DBに展開して利用している定義情報を頻繁に更新する可能性はあるが、DBHelperのonUpgradeを使うまでではない」といった用件が出てきたので、タイトルのようなコードを作成してみました。

更新のキックとしてonUpgradeを使いたくないというのは、個人的なイメージとしてDBHelperのバージョンを変更するタイミングっていうのがDBの構成を変える場合だけにしたいし、あんまり変えたくないし、onUpgradeを利用する際にはDB登録情報を全て初期化するぐらいにしないとメンテが面倒というネガティブな思いからです。

そこで、ioschedのソースにEulaHelper.javaがあったので、これをパク参考にして作ってみました。

コードの要点

  1. アプリのバージョンアップの度に勝手に更新させたい
  2. できれば重くないほうが良い(バックグラウンド)

バージョンチェックと更新処理

まずはチェック処理本体。アプリバージョンを取得してSharedPreferencesの保存値と比較する処理と、更新時のイベントとSharedPreferencesへ最新バージョンを設定する処理です。

  1: package com.miquniqu.util;
  2: 
  3: import java.util.List;
  4: 
  5: import android.content.Context;
  6: import android.content.SharedPreferences;
  7: import android.content.pm.PackageInfo;
  8: import android.content.pm.PackageManager;
  9: import android.content.pm.PackageManager.NameNotFoundException;
 10: import android.os.AsyncTask;
 11: import android.preference.PreferenceManager;
 12: 
 13: public class LatestConfigHelper {
 14:   public static final String KEY = "latest_config";
 15: 
 16:   public static int getVersionCode(Context context) {
 17:     int versionCode = 0;
 18:     PackageManager pm = context.getPackageManager();
 19:     try {
 20:       PackageInfo info = null;
 21:       info = pm.getPackageInfo(context.getPackageName(), 0);
 22:       versionCode = info.versionCode;
 23:     } catch (NameNotFoundException e) {
 24:       // 取れないことは無いと思うが。
 25:     }
 26:     return versionCode;
 27:   }
 28: 
 29:   public static boolean hasLatestConfig(final Context context) {
 30:     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
 31:     int nowCode = sp.getInt(KEY, 0);
 32:     int latestCode = getVersionCode(context);
 33:     if (nowCode != latestCode) {
 34:       // バージョンが異なる=更新必要
 35:       return false;
 36:     }
 37:     // バージョンが一致=更新不要
 38:     return true;
 39:   }
 40: 
 41:   // XML→DB更新はバックグラウンドで行なう
 42:   public static void setLatestConfig(final Context context) {
 43:     new AsyncTask<Void, Void, Void>() {
 44:       @Override
 45:       protected Void doInBackground(Void... voids) {
 46:       
 47:         // このあたりでXML読み込んだり、DB反映したり
 48: 
 49:         // バージョン更新
 50:         int latestCode = getVersionCode(context);
 51:         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
 52:         sp.edit().putInt(KEY, latestCode).commit();
 53:         return null;
 54:       }
 55:     }.execute();
 56:   }
 57: }
 58: 

setLatestConfigの中にXMLを読みこんだり、DB反映する処理を作ります。


呼び出し側


起動ActivityのonCreateあたりで呼び出します。


  1:     // 定義情報の更新(XML→DB)
  2:     if (!LatestConfigHelper.hasLatestConfig(this)) {
  3:       LatestConfigHelper.setLatestConfig(this);
  4:     }

良いところ悪いところ


良いところ



  1. DBHelperのバージョンを意識しなくてよい
  2. アプリのバージョンアップで勝手に最新反映されるので元になる定義値の値だけ更新すればよい

悪いところ



  1. 起動Activityのバックグラウンド反映なので、更新まで最新が反映されないラグがある
  2. 定義変更しなくてもアプリバージョン変更のたびに勝手に更新されるので無駄な場合もある

何に使ってるの?


目的は、常時更新されるDBテーブルからJOINで結合する先のテーブル更新です。


この値がアプリリリース以後に頻繁に更新されそうだなぁと踏んでいるので、array.xmlあたりに定義を持って、バージョン変更が行われるたびにDB反映してしまえばいいのかなーっということです。


展開するデータ量が少ないのと、正直sqliteのDBファイルによるインストール時展開とかが面倒などなどそこまでじゃない的な用途に利用できるかなって目的のコードスニペットでした。

0 件のコメント:

コメントを投稿