Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 第二次使用DatabaseHelper时出现NullPointerException_Android_Sqlite_Getwritabledatabase - Fatal编程技术网

Android 第二次使用DatabaseHelper时出现NullPointerException

Android 第二次使用DatabaseHelper时出现NullPointerException,android,sqlite,getwritabledatabase,Android,Sqlite,Getwritabledatabase,我想更新数据并在片段列表中显示,数据已经传递到db中,但在使用getWritableDatabase()进行更新时得到NullPointerException 现在我知道它不能再调用getWritableDatabase()和getReadableDatabase(),也不需要关闭数据库 我该怎么做才能完成它 计算器 public class CalcFragment extends Fragment { OnEqualSelectedListener mCallback;

我想更新数据并在片段列表中显示,数据已经传递到db中,但在使用getWritableDatabase()进行更新时得到NullPointerException

现在我知道它不能再调用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();
...
}
主课

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

传递给sqlite帮助程序的
getActivity()
上下文是
null
。这是因为您刚刚在
updateResult()
中创建了带有
new
的片段,它尚未附加到任何活动


通常,您不应该像这样直接在片段上调用
updateView()
之类的方法。相反,等待框架调用片段生命周期回调,例如
onCreateView()

调用
fragmentResult.updateView()之前执行在活动中添加/替换片段


只有在将片段附加到活动之后,才能从片段内部的
getActivity()
获得上下文。

谢谢!它起作用了!我使用FragmentTransaction替换片段。
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)