繁体   English   中英

从数据库读取数据

[英]Reading data from db

我有数据库,这里有 JSON 文件:

{
  "User": {
    "mail@gmail::com": {
      "-NKTbcSqxmB4XImNrpDq": {
        "Q": 0,
        "W": 0,
        "QW": 0,
        "WQ": 0,
        }
    },
mail@gmail:com": {
      "-NKTbcTUBxMsXYopKMO-": {
        "Q1": 0,
        "W1": 0,
        "QW1": 0,
        "WQ1": 0,
        }
    }
  }
}

当按下按钮时,我需要一次读取数据,所以我需要使用这个监听器:

database.child("User").child(getMail1).get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            User value = dataSnapshot.child("User").child(getEmail1).getValue(User.class);
            //saving data in sharedPreferences
            PreferenceConfig.Q1(getApplicationContext(), Q1);
            PreferenceConfig.W1(getApplicationContext(), W1);
            PreferenceConfig.QW1(getApplicationContext(), QW1);
            PreferenceConfig.WQ1(getApplicationContext(), WQ1);
        }
    });

getEmail - 变量 mail@gmail::com USER_KEY - 具有用户 ID 的变量 紧接着,我为第二封邮件创建了与上面完全相同的代码,只是使用了其他值:

database.child(USER_KEY).child(getMail).get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            User value = dataSnapshot.child("User").child(getEmail).getValue(User.class);
            //saving data in sharedPreferences            PreferenceConfig.Q(getApplicationContext(), Q);
            PreferenceConfig.W(getApplicationContext(), W);
            PreferenceConfig.QW(getApplicationContext(), QW);
            PreferenceConfig.WQ(getApplicationContext(), WQ);
        }
    });

getEmail - var whitch 有数据 mail@gmail:com 这里是完整的代码:

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
database.child("User").child(getMail1).get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            User value = dataSnapshot.child("User").child(getEmail1).getValue(User.class);
            PreferenceConfig.Q1(getApplicationContext(), Q1);
            PreferenceConfig.W1(getApplicationContext(), W1);
            PreferenceConfig.QW1(getApplicationContext(), QW1);
            PreferenceConfig.WQ1(getApplicationContext(), WQ1);
        }
    });
database.child("User").child(getMail1).get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            User value = dataSnapshot.child("User").child(getEmail).getValue(User.class);
            PreferenceConfig.Q(getApplicationContext(), Q);
            PreferenceConfig.W(getApplicationContext(), W);
            PreferenceConfig.QW(getApplicationContext(), QW);
            PreferenceConfig.WQ(getApplicationContext(), WQ);
        }
    });
});

但是数据不是来自数据库。 没有错误,尽管我是这样显示的:

Log.e("TaskEEEE", String.valueOf(task.getException())); 为什么读不到数据??

由于您从数据库中获取路径/User/$getMail1中的数据,因此task变量仅包含该数据的结果快照。 您可以通过调用获得此结果:

database.child("User").child(getMail1).get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            User value = task.getResult().getValue(User.class); // 👈
            ...

另请参阅有关一次获取数据的 Firebase 文档,我基于此回答。


此外,您似乎在 email 下有一个推送密钥,这将要求您知道密钥或在子节点上使用循环来获取属性:

public void onComplete(@NonNull Task<DataSnapshot> task) {
    if (task.isSuccessful()) {
        for (DataSnapshot userSnapshot: task.getResult().getChildren()) { // 👈
            User value = userSnapshot.getValue(User.class);
        }

暂无
暂无

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

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