当前位置: 首页 > 知识库问答 >
问题:

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

鱼浩荡
2023-03-14
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());
    }
 @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
}

共有1个答案

柯建修
2023-03-14

不要使用Integer.ToString(email.hashcode())作为子级,或者使用push()方法生成随机密钥,或者使用userUID(如果使用firebase身份验证)。

如果使用push(),则首先存储密钥:

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

然后,当您要检索数据时,请执行以下操作:

Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);
 类似资料:
  • 我有一个应用程序,存储256行数字,指示网格视图中每个256个单元格的背景颜色。目前所有的值都是-16449536,表示简单的黑色。 以下是我在Firebase数据库中的JSON结构 在onCreative方法中,我使用for循环为每个单元格读取256次: 并非所有网格都是黑色的。每次我重新打开应用程序以触发onCreate方法时,网格模式都会有所不同。我是否达到了firebase实时数据库的某些

  • 我是消防队的新手。我在用firebase数据库。其中我有两个节点,一个有用户信息,第二个有来自用户的所有评论。这些是数据库结构 用户节点 我要做的是获取一篇文章的所有评论,然后从评论节点获取,这实际上是对文章发表评论的用户键,然后从Firebase获取特定的用户信息。我写了以下代码。 null 评论1用户a 评论2用户b

  • 把日志放在各处,我发现它到达了语句。但是,回调从未被调用。 它卡在那一点上。没有错误。没有例外。 最大的问题是,从那时起,它停止了整个应用程序的所有回调。我的所有活动都被阻止了,因为它从不调用。看起来它在内部崩溃或被线程阻塞。

  • 我目前有一个类似以下的数据库结构。如果无法在Firebase实时数据库安全规则中循环,我如何基于用户对多个组的访问来保护数据?要遵循的例子... 数据库结构: 我如何在上指定安全规则,以基于中指定的任何组与当前用户的

  • 一切正常,但DatabaseReference无法获取数据,这就像是忽略了我的代码运行,就像我的internet无法运行一样,请帮助我,我是这个社区的新手,下面是我的代码和图片。 以前它是工作的,但由于我只是更改了一些代码,使只有currentVersion>=vCode,这样即使数据库中的值是 firebase数据库映像 mainactivity.java manifest.xml 依赖关系

  • 我有以下Firebase实时数据库连接到我的Flatter项目: 我对flutter和fire base相当陌生,我知道在我的flutter项目中访问此数据库中数据的一种方法是使用数据库引用变量。所以我有以下参考变量: 现在,如何使用此itemRef访问数据库中的温度和脉冲值?