我有一个Firebase database
,我可以从我的Android应用程序中读取和写入。但是,我在阅读的一个方面遇到了问题。
用户可以在应用程序中设置一个帐户(Firebase
电子邮件和密码)并转到数据输入屏幕,并使用以下结构将该信息保存到Firebase
:
myAndroidApp
users
21XKq2RXQYZ36l363msI26XOKdn2
description:
emailAddress:
name:
ownerName:
..... etc.
我有一个PropertyData
Java类。
保存数据的代码是:
PropertyData propertyData = new PropertyData(ownerName, headline, description....... etc.);
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
databasePropertyData.child(uid).setValue(propertyData);
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot childSnapShot : dataSnapshot.getChildren()) {
String propNameTxt = (String) childSnapShot.child("name").getValue();
String ownerNameTxt = (String) childSnapShot.child("ownerName").getValue();
所以一切似乎都运行正常,我可以登录到不同的测试用户并写入Firebase database
。
但我想要的是下载数据库中的任何现有信息并在用户下次登录时填充数据输入表单。我编写的代码执行此操作,但是当我退出测试帐户并签名时进入另一个数据输入表单由以前的帐户填充!!我以为我正在使用Uid
,但显然不是!
如果我更改了数据输入表单中的信息,则在登录帐户时,会将其保存到正确的节点。所以问题在于在启动时下载现有数据。
这是将现有数据下载到数据输入表单的代码:
databasePropertyData = FirebaseDatabase.getInstance().getReference("users");
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
//FirebaseDatabase.getInstance().getReference().child(uid).addValueEventListener(new ValueEventListener() {
//FirebaseDatabase.getInstance().getReference().child("users").child(uid).addValueEventListener(new ValueEventListener() {
FirebaseDatabase.getInstance().getReference().child("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot childSnapShot : dataSnapshot.getChildren()) {
String propNameTxt = (String) childSnapShot.child("name").getValue();
String ownerNameTxt = (String) childSnapShot.child("ownerName").getValue();
String headlineTxt = (String) childSnapShot.child("headline").getValue();
String descriptionTxt = (String) childSnapShot.child("description").getValue();
....... etc.
我在听众身上尝试了不同的变化而没有成功。任何帮助/建议表示赞赏。
答案 0 :(得分:0)
首先使用...child("users/" + uid)...
代替...child("users" + uid)...
。因为你会得到孩子 "users21XKq2RXQYZ36l363msI26XOKdn2"
。
<强>第二强>
您的监听器中的for(DataSnapshot childSnapShot : dataSnapshot.getChildren())
已经在 "users/21XKq2RXQYZ36l363msI26XOKdn2"
中逐个获取孩子。所以现在你正试图获得 "users/21XKq2RXQYZ36l363msI26XOKdn2/name/name"
, "users/21XKq2RXQYZ36l363msI26XOKdn2/description/name"
和其他人的价值。我提供给你而不是没有循环
像这样:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String propNameTxt = (String) dataSnapshot.child("name").getValue();
String ownerNameTxt = (String) dataSnapshot.child("ownerName").getValue();
String headlineTxt = (String) dataSnapshot.child("headline").getValue();
String descriptionTxt = (String) dataSnapshot.child("description").getValue();
}
您还可以使用setter和getter为这些参数( name,ownerName,headline,description )创建数据类,并使用它来获取所有数据。
像这样:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
MyData data = (MyData) dataSnapshot.getValue(MyData.class);
}
然后,您可以使用getter获取字段值:data.getName()
。我提供制定者和吸气剂,因为你可以插入一些验证。
如果您使用Firebase的数据类,请确保它具有空构造函数。
更多关于它的答案:https://stackoverflow.com/a/48868970/5272951
答案 1 :(得分:0)
您无法使用%%bash
echo "Hello World...!!!" > colabData/hello.txt
ls colabData
。要解决此问题,您有两种选择:
child("users" + uid)
或
.child("users").child(uid)
请记住,Firebase数据库中的每个节点都有它的网址。
要从单个经过身份验证的用户获取,您不需要使用child("users/" + uid)
方法。您也不需要使用getChildren()
,您只需要使用addValueEventListener
。请参阅以下代码:
addListenerForSingleValueEvent
答案 2 :(得分:0)
您可以根据需要将数据库准确地址设置为databaseReference
上的所有元素。然后通过其唯一密钥Ex获取您想要存储的特定元素: - dataSnapshot.child("name").getValue().toString();
我希望它能帮助您回复您对firebase连接感到困惑的内容。
private String CurrentUserID;
private DatabaseReference databaseReference
//Outside of Oncreate for user Detection
@Override
protected void onStart(){
super.onStart();
mAuth.addAuthStateListener(mauthListener);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
mAuth = FirebaseAuth.getInstance();
mauthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() != null){
CurrentUserID = firebaseAuth.getCurrentUser().getUid();
}
databaseReference = FirebaseDatabase.getInstance().getReference().getRoot().child("myAndroidApp").child("users").child(CurrentUserID);
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String propNameTxt = dataSnapshot.child("name").getValue().toString();
String ownerNameTxt = dataSnapshot.child("ownerName").getValue().toString();
String headlineTxt = dataSnapshot.child("headline").getValue().toString();
String descriptionTxt = dataSnapshot.child("description").getValue().toString();
}
}
}