关于java:在片段内打开数据库

Opening database inside fragment

在Java片段文件中打开数据库是有问题的。我用的这个答案和我的问题非常相似,尽管它不起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class fragmentBmi extends Fragment {
    DatabaseHandler db = new DatabaseHandler(getActivity()); //DATABASE

    public fragmentBmi() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_bmi, container, false);
        TextView bmi = (TextView) v.findViewById(R.id.BMI);
        if(db.checkDetails()){ // Check if db is empty, if not print on screen bmi,bmr,rmr. if does print message.
            Details d = db.getDetails();
            bmi.setText(String.format("BMI: %.2f", d.getBmi()));
        }
        else{
            bmi.setText(R.string.noneInfo);
        }
        return v;
    }


}

错误:

java.lang.NullPointerException: Attempt to invoke virtual method
'android.database.sqlite.SQLiteDatabase
android.content.Context.openOrCreateDatabase(java.lang.String, int,
android.database.sqlite.SQLiteDatabase$CursorFactory,
android.database.DatabaseErrorHandler)' on a null object reference

我还尝试了上下文变量,也给出了相同的错误。在Java文件片段中打开数据库有什么解决方案吗?


不能将方法getActivity()与实例变量一起使用,因为此时尚未创建Activity,该方法返回空值。要解决此问题,必须将此行DatabaseHandler db = new DatabaseHandler(getActivity());移到onActivityCreated方法:

1
2
3
4
5
@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        DatabaseHandler db = new DatabaseHandler(getActivity());
    }

当您尝试使用DB对象时,错误表明它为空。

尝试改变

1
DatabaseHandler db = new DatabaseHandler(getActivity()); //DATABASE

为了

1
DatabaseHandler db;

在onCreateView中,在视图v=后添加此行。

1
db = new DatabaseHandler(getContext());


你的DB在一个变量初始化块中被初始化,这意味着它在你的构造函数之前被执行(更多的是:Java-方法在默认构造函数之前执行)。getActivity()在片段生命周期的这一点上返回空值(有关片段生命周期的更多信息,请访问:https://developer.android.com/guide/components/fragment s.html)。

您需要在片段本身初始化之后启动数据库。