android - 更改 sqlite 数据库的名称
问题描述
我正在开发一个程序,我想在其中创建多个 SQLite 数据库。我编写了一个活动,用户可以在其中选择数据库的名称,但是我无法将该名称发送到打开数据库的活动。
我一直在从 Big Nerd Ranch Guide 中学习 Android 编程,并且由于我想存储项目列表,因此我从那本书中的 crimeIntent 程序开始。
为了选择 SQLite 数据库的名称,我创建了另一个包含数据库名称列表的数据库。用户按下按钮选择名称,但随后我想在另一个活动中打开具有该名称的 SQLite 数据库。
我的方法如下:(代码显示在消息末尾)用户在DataSetListFragment中选择SQLite数据库的名称,然后在InstructLab中打开数据库(与CriminalIntent中的CrimeLab几乎相同)。我声明了一个变量 sScheduleName,它是 SQLite 数据库的名称。首先在 DataSetListFragment 中,我尝试使用 InstructLab setter 方法分配数据库的名称。然后,当我创建 InstructLab 的实例时,sScheduleName 为空。
我尝试过其他想法。我使用 putExtra 将数据库的名称返回给 Main Activity。从 MainActivity 中,用户选择另一个活动,它将列出 SQLite 数据库的内容以及 putExtra 中返回的名称。但是,在使用 SQLite 数据库的名称之前有几层代码,我不知道如何使用 putExtra 发送名称,然后在代码中需要它的位置检索它。
我不确定要采取什么方法,以便在打开数据库时从 DataSetListFragment 到 InstructLab 实例中获取有关数据库名称的信息,所以有人可以指点我正确的方向吗?
谢谢。
公共类 DataSetListFragment 扩展片段 {
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);
}
解决方案
Fragment 是 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
}
}
推荐阅读
- flutter - 例外:无法构建插件analog_clock
- google-cloud-platform - Google Cloud Healthcare API 不支持 PlanDefintion/$apply 和 Activity Definition/$apply
- c# - c#如何在win10中通过右键将选定的文本添加到我的程序中
- javascript - 试图从 Mongo 读取数据
- javascript - date-fns:如何在应用程序范围内定义默认语言环境?
- c - SSL_free 函数崩溃
- python - 与 Chrome 浏览器类似,如何使用 Python 从 PDF 中提取文本?
- android - 无法使用 Flutter 和 Firebase 设置 Facebook 身份验证
- java - 为什么我们需要在 Spring 中使用 FreeMarker?
- wordpress - 我的网站 xml 提要仅显示单页