我在片段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文件中打开数据库?
答案 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)。
您需要在片段本身初始化后启动数据库。