gpt4 book ai didi

java - Firebase - 无法添加多个子对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:52 25 4
gpt4 key购买 nike

我制作了一个系统,负责在用户之间创建新游戏。当用户还没有游戏时,我可以毫无问题地添加一个游戏,但是当我尝试添加第二个游戏时,我会收到以下异常:

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)

所以看来抛出了错误,因为 GameActivity 类无法检索数据,因为由于某种原因未保存数据。再说一次,当我还没有游戏时,情况就不是这样了。

创建游戏的代码是:

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

}
});
}
}

}

我的数据库结构如下:

  • 游戏
    • $用户ID
      • $opponentId
        • 当前问题(长)
        • 当前答案(长)
        • canAnswer( boolean 值)
  • 用户
    • $用户ID
      • 显示名称(字符串)
      • 电子邮件(字符串)
      • 用户名(字符串)

对于每个新游戏,我想为对手添加一个 Game 对象到 games/$myId/$opponentId 和 games/$opponentId/$myId 中。

我希望你告诉我我在这里做错了什么以及如何解决这个错误。

最佳答案

addListenerForSingleValueEvent 用于从 Firebase 数据库读取数据。

如果你想写入数据可以引用下面的代码:

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

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

您可以引用this用于在 Firebase 数据库中读取和写入数据的链接。

关于java - Firebase - 无法添加多个子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43292718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com