2017-05-16 1 views
0

Ich habe Probleme mit meiner Datenbank innerhalb Fragment Java-Datei zu öffnen. Ich habe diese answer verwendet, die ziemlich ähnlich zu meinem Problem, obwohl es nicht funktioniertDatenbank öffnen innerhalb Fragment

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; 
    } 


} 

Fehler:

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

Ich habe Kontextvariable auch versucht, mir den gleichen Fehler zu geben. Gibt es eine Lösung zum Öffnen der Datenbank innerhalb der Fragment-Java-Datei?

Antwort

2

Der Fehler sagen, dass Ihr db Objekt null ist, wenn Sie versuchen, es zu benutzen.

Try

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

Für

DatabaseHandler db; 

Und in onCreateView, fügen Sie diese Zeile nach Ansicht v = ...

db = new DatabaseHandler(getContext()); 
3

Sie können die Methode getActivity() nicht mit einer Instanzvariablen verwenden, da zu diesem Zeitpunkt die Activity noch nicht erstellt wurde und die Methode null zurückgibt. Um dieses Problem zu beheben, müssen Sie diese Zeile bewegen DatabaseHandler db = new DatabaseHandler(getActivity());-onActivityCreated Methode:

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

Ihre DB in einer Variablen initialisiert wird sich ändern Initialisierungsblock, was bedeutet, dass es vor dem Konstruktor ausgeführt wird (mehr hier: Java - Method executed prior to Default Constructor). getActivity() gibt zu diesem Zeitpunkt im Lebenszyklus eines Fragments null zurück (mehr zum Fragmentlebenszyklus hier: https://developer.android.com/guide/components/fragments.html).

Sie müssen die db nach dem Fragment selbst initialisiert wurde initiieren.

Verwandte Themen