2016-12-24 2 views
0

Ich versuche, die ID des angemeldeten Benutzers zu erhalten und es in zwei Fragmente zu verwenden. In dem Fragment, das ich zuerst benutze, wird die ID in meiner globalen Variable korrekt abgerufen und gespeichert, aber wenn ich danach auf das andere Fragment zugreife, stürzt meine App ab und sagt, dass getUid() eine Nullzeiger-Ausnahme in der anderen Aktivität generiert.DatabaseException bei Verwendung von getUid() - Funktion in Firebase-Authentifizierung

Hier ist mein Code (Beide Fragmente mit Ausnahme identisch Codes für unterschiedliche Variablennamen. LDQApp ist meine Klasse für globale Variablen)

public class RecruitmentFragment extends Fragment { 

    private DatabaseReference mDatabase; 

    EditText name_text,reg_text,year_txt, mob_txt,interest_txt; 
    Button button; 

    public RecruitmentFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_recruitment, container, false); 

     name_text = (EditText)rootView.findViewById(R.id.editText2); 
     reg_text = (EditText)rootView.findViewById(R.id.editText3); 
     year_txt = (EditText)rootView.findViewById(R.id.editText4); 
     mob_txt = (EditText)rootView.findViewById(R.id.editText5); 
     interest_txt = (EditText)rootView.findViewById(R.id.editText6); 

     button = (Button)rootView.findViewById(R.id.button2); 

     FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
     mDatabase=FirebaseDatabase.getInstance().getReference("recruitment"); 

    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); 
    LDQApp.uid = firebaseUser.getUid(); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      final String name,regNo,mobNo,interest; 
      int year; 

      name = name_text.getText().toString(); 
      regNo = reg_text.getText().toString(); 
      year = Integer.parseInt(year_txt.getText().toString()); 
      mobNo = mob_txt.getText().toString(); 
      interest = interest_txt.getText().toString(); 

      RecruitUser recruitUser = new RecruitUser(name,regNo,year,mobNo,interest); 

      mDatabase.child(LDQApp.uid).setValue(recruitUser); 

      mDatabase.child(LDQApp.uid).addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        RecruitUser sUser = dataSnapshot.getValue(RecruitUser.class); 
        Toast.makeText(getContext(),"Submitted successfully",Toast.LENGTH_SHORT).show(); 

        Log.d(TAG, "User name: " + name + ", Registration No: " + regNo); 
       } 

       @Override 
       public void onCancelled(DatabaseError error) { 
        // Failed to read value 
        Log.w(TAG, "Failed to read value.", error.toException()); 
       } 
      }); 
     } 
    }); 

    return rootView; 
} 

}

Dies ist das Protokoll als

angefordert

Log

+0

Sie sagten über 2 Aktivitäten und zwei Fragmente noch hier sehe ich nur ein Fragment und ich weiß nicht, es ist das erste oder nicht? Und kein Protokoll zur Verfügung gestellt wird? Wie können wir Ihnen eine Antwort geben? –

+0

Eine kleine Änderung vorgenommen. Ich wollte nur 2 Fragmente schreiben. Ich habe auch geschrieben, dass das andere Fragment den gleichen Code mit Ausnahme einiger zusätzlicher Variablen hat. Das Fragment, auf das ich als zweites zugreife, zeigt die Ausnahme –

+0

, wie Sie sagten, dass Sie in diesem Fragment einen Wert für 'LDQApp.uid = fireBaseUser.getUid();' haben und wenn Sie auf das zweite zugreifen, dessen ('LDQApp.uid') NULL habe ich recht? –

Antwort

0

Holen Sie sich FirebaseDatabase wie folgt: Sie müssen nicht anrufen, und als signiere einen neuen Wert und verwende wieder einen statischen;

public class Util { 
private static FirebaseDatabase database; 

public static FirebaseDatabase getDatabase() { 
    if (database == null) { 
     database = FirebaseDatabase.getInstance(); 
     database.setPersistenceEnabled(true); 
    } 
return database; 
} 

} 

dann können Sie dies als Util.getDatabase() zugreifen oder Sie können es auch tun eine statische boolean zu halten, wie ich in diesem Kommentar gesagt, aber diese Redundanz mehr Code vermeidet auch.

lesen documentation enter image description here

0

Das ist ganz einfach nur eine neue Klasse erstellen, die durch Hinzufügen des Namens Attribut

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:name=".FireApp" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
Anwendung

public class FireApp extends Application { 
@Override 
public void onCreate() { 
    super.onCreate(); 
/* Enable disk persistence */ 
    FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
} 
} 

verbinden es zu einem Projekt in der Manifest-Datei erweitert

0

Gehen Sie bei der Verwendung der Firebase-Authentifizierung nicht davon aus, dass, sobald ein Benutzer angemeldet ist Benutzer wird immer angemeldet sein. Speichern Sie die UID nicht in einer globalen wie diese. Wo immer Sie den Login-Status des Benutzers wissen müssen, sollten Sie normalerweise einen AuthStateListener verwenden, um dies zu verfolgen. Der Rückruf, den Sie übergeben, wird immer mit dem korrekten Anmeldestatus des Benutzers aufgerufen, und Sie können entsprechend auf diese Informationen reagieren.

Wenn Sie getCurrentUser() verwenden, um zu versuchen, den aktuell angemeldeten Benutzer abzurufen, beachten Sie, dass es null zurückgeben kann, wenn der Benutzer nicht angemeldet ist. Das ist wahrscheinlich, und warum Aufruf von getUid() wirft eine NPE für dich.

Verwandte Themen