如何使用句柄多个片段使用方法

时间:2016-11-29 02:35:28

标签: android android-sqlite

我在类DBHelper中定义了方法select(),它扩展了SQLiteOpenHelper,在MainActivity中我启动了dtabases变量dbHelper:

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

我有4个片段,每个片段需要调用方法select(),怎么做? 在每个片段中我需要对每个片段中的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 个答案:

答案 0 :(得分:1)

您可以按照以下方式:

  1. 定义用于检索DBHelper的接口:

    public interface DBHelperSource {
        DBHelper getDBHelper();
    }
    
  2. 声明您的活动以实现界面并实施该方法以返回您的活动DBHelper对象。

    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. 在每个片段的onAttach(Context)方法中,将上下文强制转换为DBHelperSource,检索DBHelper对象,并将其存储在该片段的实例变量中。

    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;
        }
    }
    
  4. 有关此模式的详细信息,请参阅Android教程Communicating with Other Fragments

    有一个小问题:如果在活动实例化DBHelper对象之前有可能附加片段,那么您可能想要改变上面的内容如下。不要在DBHelper中初始化onAttach()字段,只需将DBHelperSource对象本身存储为字段即可。然后,只有当您需要getDBHelper()对象本身时才会调用DBHelper(即,当您准备好调用select()时)。

    另一种方法是仅定义接口以包含select方法本身,而不必将DBHelper对象传递给片段。当然,这只有在所有四个片段中的逻辑相同时才有效。