LoginSignup
59
58

More than 5 years have passed since last update.

アプリがバージョンアップしたときの手続きをアノテーションを使って整理する

Posted at

アプリのバージョンを上げた時、何かしら互換性を保つための作業が必要なことがあります。
たとえば、データベースのマイグレーションをしたり、その他永続化したデータを書き換えたり、など。時間のかかるものもあれば、かからないものもあります。

王道なやり方としては、Application#onCreate()でバージョンを覚えておいて、次にApplication#onCreate()に来た時に覚えておいたバージョンと PackageManager から取ってきたバージョン情報を突き合わせて、バージョンが変わっていたら、バージョンごとに必要な処理をする、と言った感じでしょうか。

public class MyApp extends Application {
  @Override
  public void onCreate() {
    super.onCreate();

    if (isVersionChanged()) {
      doUpdateProcedure(getStoredVersionCode(), getCurrentVersionCode());
    }
  }

  private boolean isVersionChanged() {
    int current = getCurrentVersionCode();
    int stored  = getStoredVersionCode();
    return stored < current;
  }

  private void doUpdateProcedure(int from, int to) {
    if (from < 10 && to == 12) {

    }
    // if ...
    // if ...
    // if ...
  }

  private int getCurrentVersionCode() {
    // retrieve current version code from package manager.
  }

  private int getStoredVersionCode() {
    // retrieve memorized version from shared preferences or local file.
  }
}

ここで面倒なのは、単純にこのバージョンではこうする、だけではなく、どのバージョンからアップデートしたかも重要になるものがあるということです。そして単純に実装すると、どんどん if 文が増えていき…

はぁー、その辺のロジック、VersionCode を引数に持ったアノテーションをメソッドにつけて、そのメソッドが VersionCode に応じて勝手に呼ばれてくれたら幸せだなぁと思ったので、作りました。

Fit

ライブラリ側で@OnVersionアノテーションを定義しており、引数に VersionCode を渡します。そうすると、バージョンアップ時に、前のバージョンから現在のバージョンまでの間の VersionCode が含まれたものを、バージョンアップ処理の時に呼び出します。


public class MyModule implements VersionModule {
    @OnVersion({1, 2, 3})
    public void foo() {

    }

    @OnVersion(4)
    public void bar() {

    }
}

こうすることで、もし以前のバージョンでした処理をもう一度したいときに、わざわざメソッドを分けなくても、アノテーションの引数に渡す VersionCode を増やすだけで対応出来ます。

あとは、Applicationクラスで以下の準備をして、バージョンアップ時の手続きを走らせるだけです。


public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fit.initialize(this, new MyModule());
    }
}

手続きの実行は、今のところ同期的な呼び出ししかありませんが、標準の非同期処理の仕組みと簡単に組み合わせられるので、それほど大変な作業にはならないはずです。

Fit.getInstance().execute();

59
58
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
58