首页 > 解决方案 > 更改 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);
}

标签: androidandroid-sqliteinstance-variables

解决方案


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 
}
}

推荐阅读