java - 未使用 firebase 数据库访问调用 onChange 方法

标签 java android firebase firebase-realtime-database

我在通过 Java 查询和读取我的 firebase 数据库时遇到问题。我正在尝试保存已登录用户的电子邮件,但似乎从未调用过 onChangeMethod。 我已经检查了数据库规则和 firebase 中的 sha1 指纹。 这是代码:

import android.util.Log;

import androidx.annotation.NonNull;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class LockerDatabase implements ValueEventListener{
    private FirebaseDatabase database;
    private DatabaseReference reference;

    private User currUser;
    private ArrayList<Password> passwords;

    public int count;

    public LockerDatabase(String email, String name) {
        database = FirebaseDatabase.getInstance();
        reference = database.getReference();

        currUser = new User();
        passwords = new ArrayList<>();

        if (!exists(email))
            createUser(email, name);
        else
            loadPasswords();
    }

    private void loadPasswords() {
        //TODO: read from db all passwords
    }

    public String getEmail(){
        return currUser.getEmail();
    }

    private void createUser(String email, String name) {
        currUser.setEmail(email);
        currUser.setName(name);
        currUser.setHashId(Integer.toString(email.hashCode()));

        //TODO: add user to database
    }

    private boolean exists(String email) {
        Query existence = reference.child("users").child(Integer.toString(email.hashCode()));
        existence.addValueEventListener(this);

        if (currUser == null)
            return false;
        else
            return true;
    }

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        currUser.setEmail((String)dataSnapshot.child("email").getValue());
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.w("CAN", "user_cancelled", databaseError.toException());
    }

我正在尝试在 Activity 中显示电子邮件,它显示为默认值而不是正确值:

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

    Intent intent = getIntent();
    userEmail = intent.getStringExtra("email");
    userName = intent.getStringExtra("name");

    db = new LockerDatabase(userEmail, userName);

    TextView t = findViewById(R.id.textView);
    t.setText(db.getEmail());

    //TODO: display db results
    //TODO: if the user is new, set an access key
}

这是数据库: JSON here

我不明白我的问题是由于响应时间还是代码中的某些错误引起的。 谢谢!

最佳答案

不要将 Integer.toString(email.hashCode()) 用作子项,要么使用将生成随 secret 钥的 push() 方法,要么使用用户uid 如果您使用的是 firebase 身份验证。

如果你使用push(),那么先存储 key :

String key  = reference.child("users").push().getKey();

然后当你想检索数据时,执行以下操作:

Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);

关于java - 未使用 firebase 数据库访问调用 onChange 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58911680/

相关文章:

java - 有限状态机程序无效输出

java - 无法将参数传递给 super();在扩展 RealmBaseAdapter (Realm) 的类的构造函数中

java - 在 Java API for WebSocket 1.0 中,Decoder#willDecode 真的是可选的吗?

Android 应用程序检测其他 Activity

android - Firebase JobDispatcher - 与以前的 API(JobScheduler 和 GcmTaskService)相比,它如何工作?

ios - iOS 8与iOS 10上的Firebase动态链接行为

java - Cordova 构建 Android 错误

android - 在 Eclipse IDE 中使用 ViewSwitcher

firebase - 从使用 firebase-admin 上传的文件中获取公共(public) URL

firebase - Flutter firestore 快照始终为 null 或空列表