sqliteopenhelperのstatic getApplicationContext
-
28-10-2019 - |
質問
最近、私はAndroidアプリで擬似AciverecordスタイルのDBコールを作成しようとしており、user.all(Context dbcontext)、user.find(long id、context dbcontext)、userなどのクラスメソッドの束を思いつきました。 pseudo-aciverecordによる削除(long id、context dbcontextなど)などは、「実際のActiverecord Library」などにするつもりはないということです。私は自分のコードでDBコールを理解しやすくしたいだけで、ActiverCordスタイルは個人的には最高です。これまでのところ、このコードを備えた問題はありません。たとえば
public static Cursor allAsCursor(Context dbContext) {
DBHelper dBHelper = new DBHelper(dbContext);
SQLiteDatabase database = dBHelper.getReadableDatabase();
Cursor dbQueryResult = database.query(DBHelper.TABLE_NAME_USERS, null, null, null, null, null, "_id DESC");
dbQueryResult.getCount();
database.close();
dBHelper.close();
dbContext = null;
return dbQueryResult;
}
しかし、私を悩ませているのは、私が電話をかけるときに常にアクティビティコンテキストなどを渡すことであり、ユーザークラス(user.find、user、user、user、user find、userを提供することをお勧めします。すべてなど)DBクエリごとにアプリケーションコンテキストを保存する静的変数?アプリランチまたは最初のクエリリクエストの前に行うことができます。
私の考えは、iOS CoreDataのものから来ています。ここでは、共有アプリケーションから常に得られるクエリの静的コンテキストマネージャーをほとんど獲得しました。
考え、提案、アイデアはありますか?
ありがとう。
解決
この方法は静的であるため、これらのDBクラスのメソッドのすべてが静的であると推測しているので、クラスは常に静的な方法で使用されていると思います。また、アクティビティコンテキストまたはアプリケーションコンテキストを渡しています。アプリケーションコンテキストを使用している場合は、コンテキストを設定するための別の静的方法を追加し、コンテキストにプライベートな静的参照を作成します。
例えば:
private static Context context;
public static void setContext(Context context){
YourDBHelperClass.context = context;
}
これで、トランザクションを作成するたびに渡されるのではなく、このコンテキストを参照することができます。
アクティビティコンテキストを渡す場合は、古いコンテキストを使用しようとするリスクがある場合に備えて、そのままにしておきます。