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文件片段中打开数据库有什么解决方案吗?
不能将方法
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-方法在默认构造函数之前执行)。
您需要在片段本身初始化之后启动数据库。