来自`getWritableDatabase`的NullPointerException片段

时间:2018-07-25 18:48:19

标签: android sqlite

我的问题是每当执行onCreateView()时,行db = dh.getWritableDatabase();给我一个NullPointerException,我也看了this问题,但是我们有不同的情况。我的代码是否缺少某些内容?任何帮助将不胜感激。


import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class FavMed extends Fragment {

    public SQLiteDatabase db;
    DatabaseHelper dh = new DatabaseHelper(this.getContext());

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_fav_med, container, false);

        try{
            db = dh.getWritableDatabase();
        }
        catch(Exception e){
            Log.d("log1",e.toString());
        }

        return rootView;
    }

这是日志

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试像这样修改代码:

public SQLiteDatabase db;
DatabaseHelper dh = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_fav_med, container, false);

    try{
        dh = new DatabaseHelper(this.getContext());
        db = dh.getWritableDatabase();
    }
    catch(Exception e){
        Log.d("log1",e.toString());
    }

    return rootView;
}

问题在于,当创建Fragment时,活动可能尚未准备好,因此上下文为null,因为指向片段所在的活动。是时间问题。这就是为什么应该将帮助程序的创建延迟到稍后出现上下文的阶段。

答案 1 :(得分:0)

实例化片段时上下文不可用。与@NiVeR相比,另一种可能的解决方案是:

public class FavMed extends Fragment {

public SQLiteDatabase db;
DatabaseHelper dh = null;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    dh = new DatabaseHelper(activity);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_fav_med, container, false);

    try{
        db = dh.getWritableDatabase();
    }
    catch(Exception e){
        Log.d("log1",e.toString());
    }

    return rootView;
}