NullPointerException при использовании DatabaseHelper второй раз

Я хочу обновить данные и показать в списке фрагментов, данные уже переданы в БД, но он получил NullPointerException при использовании getWritableDatabase() для обновления,

Теперь я знаю, что он не может вызывать getWritableDatabase() и getReadableDatabase() снова, и нет необходимости закрывать базу данных.

Как я должен сделать, чтобы закончить это?

Калькулятор

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

Список Примечание

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");}
}

журнал

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)

2 ответа

Решение

getActivity()Context перешел к помощнику sqlite был null, Это потому, что вы только что создали фрагмент с new в updateResult() и он еще не привязан к какой-либо деятельности.

Как правило, вы не должны вызывать методы, такие как ваш updateView() на фрагменты прямо как это. Вместо этого дождитесь обратных вызовов жизненного цикла фрагмента, таких как onCreateView() быть вызван рамкой.

Перед звонком fragmentResult.updateView(); добавить / заменить ваш фрагмент в деятельности.

Только после того, как фрагмент прикреплен к действию, вы можете иметь контекст из getActivity() внутренний фрагмент

Другие вопросы по тегам