Android sql 多个片段错误
Android sql multiple fragments error
我有一个包含多个片段的应用程序。在一个片段中,用户输入的信息存储在 sql table 中。在另一个片段中,数据从 table 中读取(目前只是将其记录到控制台以进行测试)。保存到数据库工作正常,但是当我尝试读取数据时出现错误。
我的 DBHelper class 有这些 read/insert 方法:
public class DBHelper extends SQLiteOpenHelper {
public boolean insertSubject(Integer id, String date, String RA, Integer condition, Integer age, String sex)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(SUBJECTS_ID, id);
contentValues.put(SUBJECTS_DATE, date);
contentValues.put(SUBJECTS_RA, RA);
contentValues.put(SUBJECTS_CONDITION, condition);
contentValues.put(SUBJECTS_AGE, age);
contentValues.put(SUBJECTS_SEX, sex);
db.insertOrThrow(SUBJECTS_TABLE_NAME, null, contentValues);
db.close();
return true;
}
public boolean getSubject(Short subNum){
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT * FROM subjects WHERE " + SUBJECTS_ID + "=" + subNum;
Cursor c = db.rawQuery(query, null);
while (c.moveToNext()) {
String result_0=c.getString(0);
String result_1=c.getString(1);
Log.d("query", result_0);
Log.d("query", result_1);
}
c.close();
db.close();
return true;
}
}
在我的用户创建片段中,我创建了一个新的 DBHelper:
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
db = new DBHelper(getActivity());
}
然后创建视图:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
coordinatorLayout = (CoordinatorLayout) getActivity().findViewById(R.id.coordinator_layout);
View view = inflater.inflate(R.layout.fragment_new, container, false);
mainActivity = (MainActivity) getActivity();
//Listener for create button
createButton = (Button) view.findViewById(R.id.input_submit);
createButton.setOnClickListener(this);
// Inflate the layout for this fragment
return view;
}
创建按钮有一个 onClick
侦听器:
@Override
public void onClick(View v) {
//Some form validation things go here
//write to database
try {
db.insertSubject(
Integer.parseInt(subNum),
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),
ra,
Integer.parseInt(condition),
Integer.parseInt(age),
sex);
//Store subject number for use throughout
mainActivity.subNum = Short.parseShort(subNum);
mainActivity.subCreated = true;
} catch (SQLiteConstraintException e){
Snackbar.make(coordinatorLayout, "Subject number already exists", Snackbar.LENGTH_SHORT).show();
subNumWrapper.requestFocus();
}
}
所有这些都可以很好地保存到数据库中。子号保存到主activity,所以我可以在查询数据库时使用它
但是,当尝试从数据库中读取时,我遇到了一些问题。在该片段中,我的 onActivityCreated
方法与上面的片段完全相同。然后在onCreateView
,和上面基本一样,只是增加了调用DBHelper的方法:
db.getSubject(mainActivity.subNum);
我收到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean come.example.test.DBHelper.getSubject(java.lang.Short)' on a null object reference
我认为这意味着它不知道 db
的存在?
为什么我在两个片段 classes 中以完全相同的方式(在 onActivityCreated
中)定义了 db?为什么这在主题创建片段中有效,但在查询框架中无效?
为了保持原创,
您要找的答案在这里:
在您的插入片段中,调用按如下顺序发生
onCreateView() //db still null
onActivityCreated() //db instantiated
onClick() //User clicked, db is not null
在您读取数据库片段时
onCreateView() //db still null
//Uh oh, we tried to read from db, NullPointerException
onActivityCreated() //db instantiated
我有一个包含多个片段的应用程序。在一个片段中,用户输入的信息存储在 sql table 中。在另一个片段中,数据从 table 中读取(目前只是将其记录到控制台以进行测试)。保存到数据库工作正常,但是当我尝试读取数据时出现错误。
我的 DBHelper class 有这些 read/insert 方法:
public class DBHelper extends SQLiteOpenHelper {
public boolean insertSubject(Integer id, String date, String RA, Integer condition, Integer age, String sex)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(SUBJECTS_ID, id);
contentValues.put(SUBJECTS_DATE, date);
contentValues.put(SUBJECTS_RA, RA);
contentValues.put(SUBJECTS_CONDITION, condition);
contentValues.put(SUBJECTS_AGE, age);
contentValues.put(SUBJECTS_SEX, sex);
db.insertOrThrow(SUBJECTS_TABLE_NAME, null, contentValues);
db.close();
return true;
}
public boolean getSubject(Short subNum){
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT * FROM subjects WHERE " + SUBJECTS_ID + "=" + subNum;
Cursor c = db.rawQuery(query, null);
while (c.moveToNext()) {
String result_0=c.getString(0);
String result_1=c.getString(1);
Log.d("query", result_0);
Log.d("query", result_1);
}
c.close();
db.close();
return true;
}
}
在我的用户创建片段中,我创建了一个新的 DBHelper:
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
db = new DBHelper(getActivity());
}
然后创建视图:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
coordinatorLayout = (CoordinatorLayout) getActivity().findViewById(R.id.coordinator_layout);
View view = inflater.inflate(R.layout.fragment_new, container, false);
mainActivity = (MainActivity) getActivity();
//Listener for create button
createButton = (Button) view.findViewById(R.id.input_submit);
createButton.setOnClickListener(this);
// Inflate the layout for this fragment
return view;
}
创建按钮有一个 onClick
侦听器:
@Override
public void onClick(View v) {
//Some form validation things go here
//write to database
try {
db.insertSubject(
Integer.parseInt(subNum),
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),
ra,
Integer.parseInt(condition),
Integer.parseInt(age),
sex);
//Store subject number for use throughout
mainActivity.subNum = Short.parseShort(subNum);
mainActivity.subCreated = true;
} catch (SQLiteConstraintException e){
Snackbar.make(coordinatorLayout, "Subject number already exists", Snackbar.LENGTH_SHORT).show();
subNumWrapper.requestFocus();
}
}
所有这些都可以很好地保存到数据库中。子号保存到主activity,所以我可以在查询数据库时使用它
但是,当尝试从数据库中读取时,我遇到了一些问题。在该片段中,我的 onActivityCreated
方法与上面的片段完全相同。然后在onCreateView
,和上面基本一样,只是增加了调用DBHelper的方法:
db.getSubject(mainActivity.subNum);
我收到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean come.example.test.DBHelper.getSubject(java.lang.Short)' on a null object reference
我认为这意味着它不知道 db
的存在?
为什么我在两个片段 classes 中以完全相同的方式(在 onActivityCreated
中)定义了 db?为什么这在主题创建片段中有效,但在查询框架中无效?
为了保持原创,
您要找的答案在这里:
在您的插入片段中,调用按如下顺序发生
onCreateView() //db still null
onActivityCreated() //db instantiated
onClick() //User clicked, db is not null
在您读取数据库片段时
onCreateView() //db still null
//Uh oh, we tried to read from db, NullPointerException
onActivityCreated() //db instantiated