2017-05-16 6 views
0

フラグメント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: 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ファイル内にデータベースを開く方法はありますか?

答えて

2

エラーは、あなたがそれを使用しようとすると、あなたのDBオブジェクトがnullであると言います。

することはあなたのDBを変数に初期化されたビューVの後に次の行を追加します= ...

db = new DatabaseHandler(getContext()); 
3

メソッドgetActivity()は、その時点でActivityがまだ作成されておらず、メソッドがnullを返すため、インスタンス変数を使用することはできません。この問題を修正するには、onActivityCreatedメソッドにこのラインDatabaseHandler db = new DatabaseHandler(getActivity());を移動する必要があります。

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

DatabaseHandler db; 

そしてonCreateView中の場合

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

を変更しよう初期化ブロックです。つまり、コンストラクタの前に実行されています(詳細はJava - Method executed prior to Default Constructor)。 getActivity()は、フラグメントのライフサイクルのこの時点でnullを返します(フラグメントライフサイクルの詳細はhttps://developer.android.com/guide/components/fragments.html)。

フラグメント自体が初期化された後で、dbを開始する必要があります。

関連する問題