我在类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;
}
答案 0 :(得分:1)
您可以按照以下方式:
定义用于检索DBHelper
的接口:
public interface DBHelperSource {
DBHelper getDBHelper();
}
声明您的活动以实现界面并实施该方法以返回您的活动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;
}
...
}
在每个片段的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;
}
}
有关此模式的详细信息,请参阅Android教程Communicating with Other Fragments。
有一个小问题:如果在活动实例化DBHelper
对象之前有可能附加片段,那么您可能想要改变上面的内容如下。不要在DBHelper
中初始化onAttach()
字段,只需将DBHelperSource
对象本身存储为字段即可。然后,只有当您需要getDBHelper()
对象本身时才会调用DBHelper
(即,当您准备好调用select()
时)。
另一种方法是仅定义接口以包含select
方法本身,而不必将DBHelper
对象传递给片段。当然,这只有在所有四个片段中的逻辑相同时才有效。