我正在一个程序中,我想在其中创建多个SQLite数据库。我编写了一个活动,用户可以在其中选择数据库的名称,但是我无法将名称发送给打开数据库的活动。
我一直在从《大书呆子牧场指南》中学习Android编程,并且由于我想存储项目列表,因此我从该书中的criminalIntent程序开始。
要选择SQLite数据库的名称,我创建了另一个数据库,其中包含数据库名称列表。用户按下按钮以选择名称,但是随后我想在另一个活动中使用该名称打开SQLite数据库。
我的方法如下:(消息末尾显示的代码)用户在DataSetListFragment中选择SQLite数据库的名称,然后在InstructLab中打开该数据库(这与CrimeIntent中的CrimeLab几乎相同)。我声明了一个变量sScheduleName,它是SQLite数据库的名称。首先,在DataSetListFragment中,我尝试使用InstructLab setter方法分配数据库名称。然后,当我创建InstructLab的实例时,sScheduleName为null。
我尝试了其他想法。我使用putExtra将数据库的名称返回给Main Activity。用户从MainActivity中选择另一个活动,该活动将列出在putExtra中返回的名称的SQLite数据库的内容。但是,在使用SQLite数据库名称之前,有几层代码,而且我不知道如何使用putExtra发送名称,然后在需要的代码位置检索它。
我不太确定采取什么方法,以便在打开数据库时可以从DataSetListFragment到InstructLab实例获取有关数据库名称的信息,所以有人可以向我指出正确的方向吗?
谢谢。
公共类DataSetListFragment扩展Fragment {
private String mCurrentFile;
public DataSetHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
mTitleTextView = (TextView) itemView.findViewById(R.id.list_item_dataset_info);
mNameButton = (Button) itemView.findViewById(R.id.choose_schedule_name);
mNameButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
DataSetLab.get(getActivity()).setCurrentData(mTitleTextView.getText().toString());
InstructLab.get(getActivity()).setScheduleName(mTitleTextView.getText().toString());
Log.d(TAG, "send back to MainActivity: "+mTitleTextView.getText().toString());
intent.putExtra(EXTRA_NAME,mTitleTextView.getText().toString());
getActivity().setResult(Activity.RESULT_OK,intent);
getActivity().finish();
}
});
}
}
公共类InstructLab {私有静态InstructLab sInstructLab;
private Context mContext;
private SQLiteDatabase mDatabase;
private static String sScheduleName;
public String getScheduleName() {
return sScheduleName;
}
public void setScheduleName(String scheduleName) {
this.sScheduleName = scheduleName;
Log.d(TAG,"Assigning database name:"+sScheduleName);
}
public static InstructLab get(Context context) {
if (sInstructLab == null) {
sInstructLab = new InstructLab(context);
}
return sInstructLab;
}
private InstructLab(Context context) {
mContext = context.getApplicationContext();
Log.d(TAG,"Opening Database "+sScheduleName);
mDatabase = new InstructBaseHelper(mContext,sScheduleName).getWritableDatabase();
Log.d(TAG,"Opening Database "+sScheduleName);
}
片段是Activity上的一个视图组,您不需要使用setresult来更新您的Activity。您可以只使用一个接口来与Activity通信。
public class DataSetListFragment extends Fragment {
private String mCurrentFile;
public DataSetHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
mTitleTextView = (TextView) itemView.findViewById(R.id.list_item_dataset_info);
mNameButton = (Button) itemView.findViewById(R.id.choose_schedule_name);
mNameButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
((YourActivity)getActivity()).onDataSetLab(DataSetLab.get(getActivity()).setCurrentData(mTitleTextView.getText().toString()));
((YourActivity)getActivity()).onInstructLab(InstructLab.get(getActivity()).setScheduleName(mTitleTextView.getText().toString()));
}
});
}
public interface DBNameListener {
public void onDataSetLab(String name);
public void onInstructLab(String name);
}
}
然后,在您的活动中,仅实现DBNameListener,
public class YourActivity extends Activity implements DatasetListFragment.DBNameListener {
@Override
public void onDataSetLab(String name) {
// do your stuff
}
@Override
public void onInstructLab(String name) {
// do your stuff
}
}