複数のフラグメントを持つアプリがあります。 1つのフラグメントでは、ユーザーはSQLテーブルに格納される情報を入力します。別のフラグメントでは、そのテーブルからデータが読み込まれます(現在、テスト目的でコンソールにログを記録するだけです)。 dbへの保存は正常に動作しますが、データを読み込もうとするとエラーが発生します。Android sqlの複数のフラグメントエラー
マイDBHelperクラスは、これらのインサート/読み込みのメソッドがあります。私は新しいDBHelperを作成し、私のユーザー作成の断片で
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;
}
}
を:
@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();
}
}
これにより、DBは正常に保存されます。サブ番号はメインアクティビティに保存されるので、後でデータベースにクエリするときに使用できます。
ただし、dbから読み込もうとすると問題が発生します。そのフラグメントでは、私のonActivityCreated
メソッドは文字通り上記のフラグメントと同じです。そしてonCreateView
、DBHelperメソッドを呼び出すのに加え以上が、と基本的に同じで:私はそれがないことを意味だと思う
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean come.example.test.DBHelper.getSubject(java.lang.Short)' on a null object reference
:
db.getSubject(mainActivity.subNum);
私は次のエラーを取得していますdb
の存在を認識していますか?
なぜ私は両方のフラグメントクラスで全く同じ方法(onActivityCreated
)でdbを定義しましたか?これは主題の作成断片では機能しますが、質問の断片では機能しません。
参照http://stackoverflow.com/a/32656807/369 OnActivityCreated()はonCreateView()の後に呼び出されます。 挿入フラグメントでは、挿入時にイベント駆動型のクリックが発生し、onActivityCreated()が実行されます。 dbから読み込み中、これは当てはまりません。 – chiragjn