在 Firebase Realtime Database 或 Firestore 中使用 Java 时,嵌套 POJO (Plain Old Java Object) 是指包含其他对象作为属性的 Java 对象。Firebase 需要这些对象能够被序列化和反序列化,以便在数据库和 Java 对象之间转换。
首先创建一个基本的 POJO 类,包含 getter 和 setter 方法:
public class User {
private String name;
private int age;
private Address address; // 嵌套的 POJO
// 空构造器是必需的
public User() {}
public User(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
// Getter 和 Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
创建嵌套的 Address 类:
public class Address {
private String street;
private String city;
private String zipCode;
// 空构造器
public Address() {}
public Address(String street, String city, String zipCode) {
this.street = street;
this.city = city;
this.zipCode = zipCode;
}
// Getter 和 Setter
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
原因:嵌套的 POJO 类缺少空构造器或 getter/setter 方法
解决方案:
原因:可能在设置值时遗漏了嵌套对象
解决方案:
Address address = new Address("123 Main St", "Springfield", "12345");
User user = new User("John Doe", 30, address);
// 然后保存到 Firebase
原因:Java 字段名与数据库中的字段名不一致
解决方案:使用 @PropertyName
注解:
import com.google.firebase.database.PropertyName;
public class Address {
@PropertyName("street_address")
private String street;
// ...
}
// 写入数据到 Firebase
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
Address address = new Address("456 Oak Ave", "Metropolis", "67890");
User user = new User("Jane Smith", 28, address);
ref.push().setValue(user);
// 从 Firebase 读取数据
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
Log.d("User", "Name: " + user.getName());
Log.d("User", "Address: " + user.getAddress().getCity());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("Error", "loadPost:onCancelled", databaseError.toException());
}
});
没有搜到相关的沙龙