[英]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: 我的数据库结构如下:
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.