在片段内打开数据库

时间:2017-05-16 14:59:30

标签: java android fragment

我在片段java文件中打开数据库时遇到问题。 我已经使用了answer,这与我的问题非常相似,虽然它不起作用

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:尝试调用虚方法   “android.database.sqlite.SQLiteDatabase   android.content.Context.openOrCreateDatabase(java.lang.String,int,   android.database.sqlite.SQLiteDatabase $ CursorFactory,   android.database.DatabaseErrorHandler)'对空对象引用

我也试过了Context变量,也给了我同样的错误。 有没有解决方案在片段java文件中打开数据库?

3 个答案:

答案 0 :(得分:3)

您无法使用方法getActivity()使用实例变量,因为此时尚未创建Activity并且该方法返回null。要解决此问题,您必须将此行DatabaseHandler db = new DatabaseHandler(getActivity());移至onActivityCreated方法:

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

答案 1 :(得分:2)

当您尝试使用它时,错误表明您的db对象为null。

尝试更改

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

对于

DatabaseHandler db;

在onCreateView中,在View v = ...

之后添加此行
db = new DatabaseHandler(getContext());

答案 2 :(得分:1)

您的数据库在变量初始化块中初始化,这意味着它在构造函数之前执行(更多这里:Java - Method executed prior to Default Constructor)。 getActivity()此时在Fragment的生命周期中返回null(更多关于片段生命周期:https://developer.android.com/guide/components/fragments.html)。

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