android 从firebase实时数据库读取数据

6fe3ivhb  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(173)

我正在使用另一个带有构造函数的类向数据库写入数据,但我仍然需要从数据库读取数据。在文档中,当使用其他类时,需要为每个元素创建HashMap列表,但我有2个类(因为我需要向数据库写入超过255个条目),我将不得不写一个HashMap。我如何加载一个DB变量的名称,它与文件本身的名称相同?例如,int b = 0;和数据库中的-b: 0,以及如何从数据库中获取每个变量的值?我这样发送数据:

if (user != null) {
if(database.child(getEmail)==null) {
User newUser = new User(getEmail, coins, ....);
User1 newUser1 = new User1(a256, a257, ....);
database.child(getEmail).push().setValue(newUser1);
database.child(getEmail).push().setValue(newUser);
}

我读到这样的数据:

ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot ds : snapshot.getChildren()){
User user = ds.getValue(User.class);
//saving information witch will read from db in SharedPreferences
PreferenceConfig.GetEmail(getApplicationContext(), getEmail);
PreferenceConfig.GetCoin(getApplicationContext(), getEmail);
PreferenceConfig.GetA256(getApplicationContext(), a256);
...
}
}
database.addValueEventListener(valueEventListener);

但是我不明白如果没有hashmap JSON文件,我如何从db中获取数据:

{
  "User": {
    "mail@gmail:com": {
      "-NHTVinbEVUAqJwK8Umt": {
        "getEmail": "mail@gmail.com",
        "coins": 100,
        .....
      },
      "-NHTVinpCPOJ4UPZvgpN": {
        "a256":0,
        "a257":0
          ...............
      }
    }
  }
}
ryevplcw

ryevplcw1#

您将无法读取动态创建的字段下的数据:

{
  "User": {
    "mail@gmail:com": {
      "-NHTVinbEVUAqJwK8Umt": {
        "getEmail": "mail@gmail.com",
        "coins": 100,
      },
      "-NHTVinpCPOJ4UPZvgpN": {
        "a256":0, //👈
        "a257":0 //👈
      }
    }
  }
}

如果您的第二个子项与第一个子项具有相同的字段,则您将能够读取所有数据:

{
  "User": {
    "mail@gmail:com": {
      "-NHTVinbEVUAqJwK8Umt": {
        "getEmail": "mail@gmail.com",
        "coins": 100,
      },
      "-NHTVinpCPOJ4UPZvgpN": {
        "getEmail": "other@gmail.com", //👈
        "coins": 200, //👈
      }
    }
  }
}

现在,要从这样的结构中读取数据,必须创建一个指向mail@gmail:com节点的引用,并进行get()调用,如以下代码行所示:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference emailRef = db.child("User").child("mail@gmail:com");
emailRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                String email = ds.child("getEmail").getValue(String.class);
                Log.d("TAG", email);
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Never ignore potential errors!
        }
    }
});

logcat中的结果为:

mail@gmail.com
other@gmail.com

或者,您可以将每个DataSnapshot对象Map到User类型的对象:

User user = ds.getValue(User.class);

User类包含两个名为getEmailcoins的字段时,此操作才有效。第一个字段是字符串,第二个字段是数字。

相关问题