Firebase 数据库无法将数据检索到 class(returns 空)
Firebase database cant retrieve data into class (returns null)
一直在看教程和论坛,什么都试过了,还是找不到解决办法。当我使用 getValue() 检索数据并将其放入对象时,它会看到这些值,但是当我尝试使用 getValue(Kontaktas.class) 访问 class 时,这些值为空。我做错了什么?
主要
package com.juliusj.gym.easy;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
DatabaseReference mRef, mIn;
List<Kontaktas> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mList = new ArrayList<>();
mRef = FirebaseDatabase.getInstance().getReference();
//mRef = FirebaseDatabase.getInstance().getReferenceFromUrl("https://easy-683ba.firebaseio.com/users");
mIn = mRef.child("users");
mIn.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//shake hands
for (DataSnapshot unit : dataSnapshot.getChildren()){
Kontaktas value = unit.getValue(Kontaktas.class);
mList.add(value);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
Kontaktas.java
package com.juliusj.gym.easy;
public class Kontaktas {
private String vardas;
private String telefonas;
public Kontaktas()
{}
public Kontaktas(String vardas, String telefonas){
this.vardas = vardas;
this.telefonas = telefonas;
}
public String getVardas() { return vardas; }
public void setVardas(String vardas) {
this.vardas = vardas;
}
public String getTelefonas() {
return telefonas;
}
public void setTelefonas(String telefonas) {
this.telefonas = telefonas;
}
}
我首先看到的错误是,您数据库中的字段与模型 class 中的字段不同!在您的数据库中,您的 Telefonas
字段是大写 T
,而在您的模型 class 中,您的 telefonas
是小写 t
。两个字段必须相同。您要么更改数据库中的密钥,要么更改模型 class。但我建议您删除实际数据并使用您的模型添加新数据 class 这是正确的。
此外,如果您尝试在 onDataChange()
方法之外打印 mList
ArrayList 的值,您将得到一个空列表。这是因为 onDataChange()
方法具有异步行为。要解决此问题,请使用以下代码:
mIn.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<Kontaktas> mList = new ArrayList<>();
for (DataSnapshot unit : dataSnapshot.getChildren()){
Kontaktas value = unit.getValue(Kontaktas.class);
mList.add(value);
}
Log.d("TAG", mList);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
如果您想在 onDataChange()
方法之外使用 mList
,您需要创建自己的回调,为此我建议您查看我的答案的最后一部分 .
一直在看教程和论坛,什么都试过了,还是找不到解决办法。当我使用 getValue() 检索数据并将其放入对象时,它会看到这些值,但是当我尝试使用 getValue(Kontaktas.class) 访问 class 时,这些值为空。我做错了什么?
主要
package com.juliusj.gym.easy;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
DatabaseReference mRef, mIn;
List<Kontaktas> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mList = new ArrayList<>();
mRef = FirebaseDatabase.getInstance().getReference();
//mRef = FirebaseDatabase.getInstance().getReferenceFromUrl("https://easy-683ba.firebaseio.com/users");
mIn = mRef.child("users");
mIn.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//shake hands
for (DataSnapshot unit : dataSnapshot.getChildren()){
Kontaktas value = unit.getValue(Kontaktas.class);
mList.add(value);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
Kontaktas.java
package com.juliusj.gym.easy;
public class Kontaktas {
private String vardas;
private String telefonas;
public Kontaktas()
{}
public Kontaktas(String vardas, String telefonas){
this.vardas = vardas;
this.telefonas = telefonas;
}
public String getVardas() { return vardas; }
public void setVardas(String vardas) {
this.vardas = vardas;
}
public String getTelefonas() {
return telefonas;
}
public void setTelefonas(String telefonas) {
this.telefonas = telefonas;
}
}
我首先看到的错误是,您数据库中的字段与模型 class 中的字段不同!在您的数据库中,您的 Telefonas
字段是大写 T
,而在您的模型 class 中,您的 telefonas
是小写 t
。两个字段必须相同。您要么更改数据库中的密钥,要么更改模型 class。但我建议您删除实际数据并使用您的模型添加新数据 class 这是正确的。
此外,如果您尝试在 onDataChange()
方法之外打印 mList
ArrayList 的值,您将得到一个空列表。这是因为 onDataChange()
方法具有异步行为。要解决此问题,请使用以下代码:
mIn.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<Kontaktas> mList = new ArrayList<>();
for (DataSnapshot unit : dataSnapshot.getChildren()){
Kontaktas value = unit.getValue(Kontaktas.class);
mList.add(value);
}
Log.d("TAG", mList);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
如果您想在 onDataChange()
方法之外使用 mList
,您需要创建自己的回调,为此我建议您查看我的答案的最后一部分