c'est mon premier projet dans firebase. J'essaie de supprimer la valeur de Firebase, mais chaque fois que j'essaie de supprimer de la valeur de Firebase, mon application se bloque. Je ne comprends pas comment résoudre cette erreur
Service.class
public class NotiListener extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
//When the service is started
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Opening sharedpreferences
SharedPreferences sharedPreferences = getSharedPreferences(Constant.SHARED_PREF, MODE_PRIVATE);
//Getting the firebase id from sharedpreferences
String id = sharedPreferences.getString(Constant.UNIQUE_ID, null);
//Creating a firebase object
Firebase firebase = new Firebase(Constant.FIREBASE_APP + id);
//Adding a valueevent listener to firebase
//this will help us to track the value changes on firebase
firebase.addValueEventListener(new ValueEventListener() {
//This method is called whenever we change the value in firebase
@Override
public void onDataChange(DataSnapshot snapshot) {
if(snapshot.child("msg") != null){
String msg = snapshot.child("msg").getValue().toString();
if (msg.equals("none"))
return;
showNotification(msg);
} else{
Log.e("Value-->","Null");
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("The read failed: ", firebaseError.getMessage());
}
});
return START_STICKY;
}
@Override
public void onDestroy() {
Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show();
}
private void showNotification(String msg){
//Creating a notification
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com"));
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
builder.setContentIntent(pendingIntent);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
builder.setContentTitle("Firebase Push Notification");
builder.setContentText(msg);
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build());
}
}
Le code pour supprimer la valeur est:
Firebase firebase=new Firebase(Constant.FIREBASE_APP+id);
firebase.orderByChild(id).equalTo(id).addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
dataSnapshot.getRef().removeValue();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
Bûche:
10-21 17:46:17.384 30986-30986/com.example.pitech09.bizfriend E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.pitech09.bizfriend, PID: 30986
Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Java.lang.Object.toString()' on a null object reference
at com.example.pitech09.bizfriend.NotiListener$1.onDataChange(NotiListener.Java:52)
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.Java:56)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.Java:45)
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.Java:38)
at Android.os.Handler.handleCallback(Handler.Java:739)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:135)
at Android.app.ActivityThread.main(ActivityThread.Java:5343)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:905)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:700)
dataSnapshot.getRef().setValue(null);
n'est pas la bonne façon de supprimer votre objet Firebase. Vous n'êtes pas autorisé à enregistrer une valeur null dans votre base de données. Pour l'enlever, vous utilisez:
dataSnapshot.getRef().removeValue();
Vous devriez également vérifier si la valeur n'est pas nulle, car vous allez supprimer cet objet.
if(snapshot.child("msg").getValue() != null){
String msg = snapshot.child("msg").getValue().toString();
return;
}
Lorsque vous supprimez une valeur, il existe une NullPointerException
lorsque vous essayez de récupérer la valeur dans la ValueEventListener
.
Cette ligne:
String msg = snapshot.child("msg").getValue().toString();
Vous devriez vérifier si (snapshot != null && snapshot.child("msg").getValue() != null
befure vous obtenez la valeur.
En fait, si vous voyez l'implémentation de removeValue () de firebase, cela revient à définir la valeur à null.
public Task<Void> removeValue() {
return this.setValue((Object)null);
}
Définissez donc la valeur sur null ou utilisez la fonction removeValue () identique.
bonjour @Satish Lodhi, il vous suffit de passer la clé de l’article que vous retirez de Firebase et de mettre cette ligne.
rootRef.child(clickedKey).removeValue();