简体   繁体   English

Firebase - 无法添加多个子对象

[英]Firebase - Can't add multiple child objects

I made a system which is responsible for creating new games between users. 我制作了一个负责在用户之间创建新游戏的系统。 When the user has no games yet I can add one without any problems, but when I try to add a second game I get the following exception: 当用户还没有游戏时我可以添加一个没有任何问题,但当我尝试添加第二个游戏时,我得到以下异常:

Exception java.lang.NullPointerException: Attempt to read from field 'long com.skydropdesign.whoisthemost.models.Game.currentQuestion' on a null object reference 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 (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120) 异常java.lang.NullPointerException:尝试从空对象引用com.skydropdesign.whoisthemost.GameActivity $ 1.onDataChange(GameActivity.java:68)com中读取字段'long com.skydropdesign.whoisthemost.models.Game.currentQuestion'。 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(Method.java)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)com。 android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

So it seems that the error is thrown, because the GameActivity class can't retrieve the data, since this is not saved for some reason. 因此似乎抛出了错误,因为GameActivity类无法检索数据,因为由于某种原因这不会保存。 Again, this is not the case when I have no games yet. 同样,当我还没有游戏时,情况并非如此。

The code to create a game is: 创建游戏的代码是:

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) {

            }
        });
    }
}

} }

My database structure is as follows: 我的数据库结构如下:

  • games 游戏
    • $userId $用户id
      • $opponentId $ opponentId
        • currentQuestion (long) currentQuestion(长)
        • currentAnswer (long) currentAnswer(长)
        • canAnswer (boolean) canAnswer(布尔值)
  • users 用户
    • $userId $用户id
      • displayName (string) displayName(string)
      • email (string) 电邮(字符串)
      • username (string) 用户名(字符串)

For every new game I want to add a Game object to games/$myId/$opponentId and games/$opponentId/$myId for the opponent. 对于每个新游戏,我想为对手添加一个游戏对象/ $ myId / $ opponentId和games / $ opponentId / $ myId。

I hope you tell me what I'm doing wrong here and how I can solve this error. 我希望你告诉我这里我做错了什么以及如何解决这个错误。

addListenerForSingleValueEvent is used to read the data from Firebase Database. addListenerForSingleValueEvent用于从Firebase数据库读取数据。

If you want to write the data then you can refer to following code: 如果要编写数据,可以参考以下代码:

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

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

You can refer this link to read and write data in Firebase database. 您可以参考链接在Firebase数据库中读取和写入数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM