I want to update data and show in the fragment list, the data is already pass into db, but it got NullPointerException when use getWritableDatabase() to update,
Now I know it can't called getWritableDatabase() and getReadableDatabase() again, and no need to close database.
How should I do to finish it?
Calculator
public class CalcFragment extends Fragment {
OnEqualSelectedListener mCallback;
public interface OnEqualSelectedListener {
public void updateResult();
}
...
private void getEqualResult() {
textview_result.setText(mResult + sum);
mDbHelper = new DB(getActivity());
mDbHelper.open();
mDbHelper.create(mResult + sum);
mDbHelper.close();
mCallback.updateResult();
...
}
MainActivity.class
public class MainActivity extends FragmentActivity implements CalcFragment.OnEqualSelectedListener {
View view;
...
@Override
public void updateResult() {
NoteFragment fragmentResult = new NoteFragment();
fragmentResult.updateView();
if(Debug.log){ Log.d("MainActivity", "updateResult");}
}
DB.class
private static class DatabaseHelper extends SQLiteOpenHelper {
...
public DB(Context context) {
this.mContext = context;
if (Debug.log) {
Log.d("DB", "DB");
}
}
public DB open() throws SQLException {
dbHelper = new DatabaseHelper(mContext);
db = dbHelper.getWritableDatabase();
if (Debug.log) {Log.d("DB", "SQLException");
}
return this;
}
public void close() {
dbHelper.close();
if (Debug.log) {
Log.d("DB", "close");
}
}
public Cursor getAll() {
mCursor = db.rawQuery("SELECT * FROM history ORDER BY created DESC",
null);
return mCursor;
}
List Note
public class NoteFragment extends ListFragment {
private DB mDbHelper;
private Cursor mCursor;
private SimpleCursorAdapter adapter;
...
public void setAdapter(){
mDbHelper = new DB(getActivity());
mDbHelper.open();
mCursor = mDbHelper.getAll();
getActivity().startManagingCursor(mCursor);
String[] from_column = new String[]{DB.KEY_ITEM, DB.KEY_CREATED};
int[] to_layout = new int[]{android.R.id.text1, android.R.id.text2};
adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2,
mCursor, from_column, to_layout);
setListAdapter(adapter);
if(Debug.log){ Log.d("NoteFragment", "setAdapter");}
}
public void updateView(){
mDbHelper = new DB(getActivity());
mDbHelper.open();
mCursor = mDbHelper.getAll();
getActivity().startManagingCursor(mCursor);
String[] from_column = new String[]{DB.KEY_ITEM, DB.KEY_CREATED};
int[] to_layout = new int[]{android.R.id.text1, android.R.id.text2};
adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2,
mCursor, from_column, to_layout);
adapter.changeCursor(mCursor);
adapter.notifyDataSetChanged();
if(Debug.log){ Log.d("NoteFragment", "updateView");}
}
log
03-27 06:09:05.550: E/AndroidRuntime(2652): FATAL EXCEPTION: main
03-27 06:09:05.550: E/AndroidRuntime(2652): java.lang.NullPointerException
03-27 06:09:05.550: E/AndroidRuntime(2652): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
03-27 06:09:05.550: E/AndroidRuntime(2652): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
03-27 06:09:05.550: E/AndroidRuntime(2652): at com.example.mycalc.DB.open(DB.java:85)
03-27 06:09:05.550: E/AndroidRuntime(2652): at com.example.mycalc.NoteFragment.updateView(NoteFragment.java:85)
03-27 06:09:05.550: E/AndroidRuntime(2652): at com.example.mycalc.MainActivity.updateResult(MainActivity.java:34)
03-27 06:09:05.550: E/AndroidRuntime(2652): at com.example.mycalc.CalcFragment.getEqualResult(CalcFragment.java:258)
03-27 06:09:05.550: E/AndroidRuntime(2652): at com.example.mycalc.CalcFragment.access$1(CalcFragment.java:239)
03-27 06:09:05.550: E/AndroidRuntime(2652): at com.example.mycalc.CalcFragment$1.onClick(CalcFragment.java:171)
The getActivity()
Context
passed to the sqlite helper was null
. This is because you've just created the fragment with new
in updateResult()
and it's not attached to any activity yet.
Generally, you should not be invoking methods such as your updateView()
on fragments directly like this. Instead, wait for the fragment lifecycle callbacks such as onCreateView()
to be invoked by the framework.