2017-04-08 1 views
1

Ich habe ein System erstellt, das für das Erstellen neuer Spiele zwischen Benutzern verantwortlich ist. Wenn der Benutzer keine Spiele hat noch kann ich ein Add ohne Probleme, aber wenn ich versuche, ein zweites Spiel hinzuzufügen ich die folgende Ausnahme erhalten:Firebase - Mehrere untergeordnete Objekte können nicht hinzugefügt werden

Ausnahme java.lang.NullPointerException: Der Versuch von Feld zu lesen ' lange com.skydropdesign.whoisthemost.models.Game.currentQuestion‘auf einer null-Objektreferenz com.skydropdesign.whoisthemost.GameActivity $ 1.onDataChange (GameActivity.java:68) com.google.firebase.database.Query $ 1. onDataChange() com.google.android.gms.internal.zzbpx.zza() com.google.android.gms.internal.zzbqx.zzZT() com.google.android.gms.internal.zzbra $ 1.run() android.os.Handler.handleCallback (Handler.java:739) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:148) android.app. ActivityThread.main (ActivityThread.java:7325) java.lang.reflect.Method.invoke (Methode.java) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230) com.android .internal.os.ZygoteInit.main (ZygoteInit.java:1120)

So scheint es, dass der Fehler ausgelöst wird, weil die GameActivity Klasse die Daten nicht abrufen können, da dies aus irgendeinem Grund nicht gespeichert wird. Auch das ist nicht der Fall, wenn ich noch keine Spiele habe.

Der Code, ein Spiel zu erstellen ist:

package com.skydropdesign.whoisthemost; 

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.Query; 
import com.google.firebase.database.ValueEventListener; 
import com.skydropdesign.whoisthemost.models.Game; 

import java.util.Random; 

public class AddGameActivity extends BaseActivity implements View.OnClickListener { 
protected String username; 
protected String opponentId; 
protected ProgressDialog dialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_new_game); 

    Button playButton = (Button) findViewById(R.id.play_button); 
    playButton.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    if(v.getId() == R.id.play_button) { 
     EditText editText = (EditText) findViewById(R.id.player_username); 
     username = editText.getText().toString().trim().toLowerCase(); 

     dialog = new ProgressDialog(this); 
     dialog.setTitle("Loading"); 
     dialog.setCancelable(false); 

     Query query = database.getReference("users").orderByChild("username").equalTo(username); 
     query.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if(dataSnapshot.exists()) { 

        for(DataSnapshot gameSnapshot : dataSnapshot.getChildren()) { 
         opponentId = gameSnapshot.getKey(); 

         Query query1 = database.getReference("games").child(user.getUid()); 
         query1.addListenerForSingleValueEvent(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           if (!dataSnapshot.exists()) { 
            Random rn = new Random(); 
            long chosenQuestion = rn.nextInt(getResources().getStringArray(R.array.questions).length); 

            database.getReference("games").child(user.getUid()).child(opponentId).setValue(
              new Game(chosenQuestion, -1, true) 
            ); 
            database.getReference("games").child(opponentId).child(user.getUid()).setValue(
              new Game(chosenQuestion, -1, false) 
            ); 
           } 

           dialog.dismiss(); 
           Intent gameIntent = new Intent(AddGameActivity.this, GameActivity.class); 
           gameIntent.putExtra("gameId", opponentId); 
           //startActivity(gameIntent); 
           finish(); 
          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 

          } 
         }); 
        } 

       } else { 
        Toast.makeText(AddGameActivity.this, "That username does not exist", Toast.LENGTH_SHORT).show(); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 
} 

}

Meine Datenbank-Struktur ist wie folgt:

  • Spiele
    • $ userId
      • $ opponentId
        • currentQuestion (long)
        • currentAnswer (long)
        • canAnswer (boolean)
  • Benutzer
    • $ userId
      • display (string)
      • E-Mail (string)
      • username (string)

Für jedes neue Spiel, das ich ein Spiel Objekt Spiele/$ myid hinzufügen möchten/$ Gegner-ID und Spiele/$ Gegner-ID/$ My-ID für den Gegner.

Ich hoffe, Sie sagen mir, was ich hier falsch mache und wie ich diesen Fehler beheben kann.

+0

Wenn Sie mehrere Kinder haben, empfehle ich, reference.updateChildren (Karte) zu verwenden, um sie zu aktualisieren. – JacksOnF1re

Antwort

0

addListenerForSingleValueEvent wird verwendet, um lesen Sie die Daten aus der Firebase-Datenbank.

Wenn Sie die Daten schreiben möchten, dann können Sie folgenden Code verweisen:

private DatabaseReference mDatabase; 
mDatabase = FirebaseDatabase.getInstance().getReference(); 

mDatabase.child("games").child($userId).setValue(user_id); 

Sie this Link verweisen können Daten in Firebase Datenbank lesen und zu schreiben.

Verwandte Themen