15

ORMLite パッケージを使用して Android アプリケーションを作成しようとしています。私にはいくつかのアクティビティとサービスがあり、https://github.com/tomquist/Android-Error-Reporterも使用して、クライアントの pdas からエラーを受け取ることができます。ORMLite では、すべてのアクティビティとサービスが OrmLiteBaseActivity などを拡張するか、各アクティビティに適切なコードを追加して、データベース ヘルパーを取得し、アクティビティの終了後にそれを解放できるようにする必要があります。したがって、このコードをすべてのアクティビティまたはサービスに追加するのはあまり便利ではありません。データベースを使用できるヘルパークラスもいくつかあります

また、いくつかのグローバル情報とメソッドを保持するアプリケーション クラスもあります。そこで、アプリケーション クラスで ormlite ヘルパーを開き、次のようにすべてのアクティビティ/クラスで使用することにしました。

public class MyApplication extends Application {
  private volatile DatabaseHelper databaseHelper = null;

  @Override
  public void onCreate() {
    super.onCreate();
  }

  @Override
  public void onTerminate() {
    if (databaseHelper != null) {
      OpenHelperManager.releaseHelper();
      databaseHelper = null;
    }
    super.onTerminate();
  }

  public DatabaseHelper getHelper() {
    if (databaseHelper == null) {
      databaseHelper = OpenHelperManager.getHelper(this, DatabaseHelper.class);
    }
    return databaseHelper;
  }
}

この方法で他のクラスで使用します。

((MyApplication) getApplicationContext()).getHelper();

このように使用するのは良い考えだと思いますか、それともメモリリークやその他の問題が発生する可能性がありますか? 私の懸念は、onTerminate が実際のデバイスで機能しないことです...私は「新しいものを試してみる」段階にあるので、間違ったアプローチで将来発生する可能性のある問題を排除するために、これについてのコメントを聞きたいと思います。コードを書き直すこと。

4

1 に答える 1

7

全体的なメカニズムは@Alexに問題ないように見えますが、私の知る限り、エミュレートされた環境onTerminate()でのみ使用されるため、あまり使用されません。プログラムは、実機で終了すると Android OS によって強制終了されるため、メモリ リークなどを心配する必要はありません。

コードで最も重要なことは、単一のdatabaseHelperインスタンスを保証することです。各インスタンスにはデータベースへの独自の接続があり、プログラムでデータベースに対して複数の接続が開かれていると問題が発生します。Sqlite は、同じ接続を同時に使用する複数のスレッドを処理しますが、複数の接続をうまく処理できず、データの不整合が発生する可能性があります。

于 2011-11-21T15:10:42.360 に答える