2016-11-29 11 views
0

私は、selectメソッド()クラスDBHelperで定義されていた私はdtabases変数dbHelper開始MainActivityで、SQLiteOpenHelperを拡張することがあります。は、どのようにメソッドを使用するために、複数のフラグメントを扱う使用する

DBHelper dbHelper = new DBHelper(this, "DB"); 

を私は4つの断片それぞれ必要としているがメソッドselect()を呼び出すには、どうすればいいですか? 各フラグメントで2番目には、各フラグメントのdbHelperの定義を行う必要がありますか、またはMainActivityから取得する方法があります。

DBHelper dbHelper = new DBHelper(getActivity(), "DBTEST"); 
     SQLiteDatabase db =dbHelper.getReadableDatabase(); 

これは、select()メソッドです:あなたはこのレシピに従うことができ

public Cursor selectdb(String tsql) {  
     DBHelper dbHelper = new DBHelper(getActivity(), "DBTest"); 
     SQLiteDatabase db =dbHelper.getReadableDatabase(); 
     Cursor c = db.rawQuery(tsql, null); 
     db.close(); 
     return c; 
    } 

答えて

1

  1. DBHelperを取得するためのインタフェースを定義します。

    public interface DBHelperSource { 
        DBHelper getDBHelper(); 
    } 
    
  2. Dインターフェイスを実装するためのアクティビティを作成し、アクティビティのDBHelperオブジェクトを返すメソッドを実装します。各断片のonAttach(Context)方法において

    public class MyActivity extends Activity implements DBHelperSource { 
        ... 
        private DBHelper mDBHelper; 
    
        @Override public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         mDBHelper = new DBHelper(this, "DBTest"); 
         ... 
        } 
    
        @Override public DBHelper getDBHelper() { 
         return mDBHelper; 
        } 
        ... 
    } 
    
  3. は、DBHelperオブジェクトを取得し、その断片のインスタンス変数でそれを隠し、DBHelperSourceにコンテキストをキャスト。このパターンの詳細については

    public class MyFragment extends Fragment { 
        private DBHelper mDBHelper; 
    
        ... 
    
        @Override public void onAttach(Context context) { 
         super.onAttach(context); 
         if (context instanceof DBHelperSource) { 
          mDBHelper = ((DBHelperSource) context).getDBHelper(); 
         } 
        } 
    
        @Override public void onDetach() { 
         super.onDetach(); 
         mDBHelper = null; 
        } 
    } 
    

、AndroidのチュートリアルCommunicating with Other Fragmentsを参照してください。

ちょっとした問題があります:アクティビティがDBHelperオブジェクトをインスタンス化する前にフラグメントがアタッチされている可能性がある場合は、おそらく上記のように変更します。 DBHelperフィールドをonAttach()に初期化する代わりに、DBHelperSourceオブジェクト自体をフィールドとして保存するだけです。 DBHelperオブジェクト(つまり、select()に電話する準備ができたとき)が必要なときにのみ、getDBHelper()に電話してください。

もう1つの方法は、selectメソッド自体を含むようにインターフェイスを定義し、DBHelperオブジェクトをそのフラグメントに通信することを煩わしくしないことです。もちろん、これはロジックが4つのフラグメントすべてで同一である場合にのみ機能します。

+0

mainactivityで定義したdbHelper変数はどうですか、別のフラグメントでも使用できますか、新しいDBHelper(getActivity()、 "DBTEST")を作成する必要があります。そのDBにアクセスする各フラグメントがあります。 –

+0

@Mi_Dhah - あなたはそれを再利用できるはずです。 –

+0

可能な場合は、mainactivityがインターフェイスを実装するときにコードを書いてください。私は「あなたのアクティビティのDBHelperオブジェクトを返す」と混同します。 –

関連する問題