Firebase嵌套的基础对象

时间:2016-11-19 20:39:10

标签: java android firebase firebase-realtime-database

是否可以将多态性与Firebase数据库一起使用?

假设我们有这样的数据:

players : {
     "player1" : {
          "name" : "BigJohn",
          "pet" : {
               "name" : "LittleDog",
               "age" : 5
          } 
     }, 
     "player2" : {
          "name" : "FunnyAndrew",
          "pet" : {
               "name" : "DuckDuck",
               "sharp_beak" : true
          }
     }
}

我们会将其更改为JavaBeans:

class Player {
      String name;
      Pet pet;
}

class Pet {
      String name;
}

class Dog extends Pet {
      int age;
}

class Duck extends Pet {
      boolean sharpBeak;
}

是否有可能实现这样的目标?

2 个答案:

答案 0 :(得分:0)

当然可以。只需使用setValue方法推送您的对象,Firebase就会将其上传为JSON树:

public class User {

public String username;
public String email;
public Account account;

public User() {
    // Default constructor required for calls to DataSnapshot.getValue(User.class)
}

public User(String username, String email, Account account) {
    this.username = username;
    this.email = email;
    this.account = account
}

}

并写下:

private void writeNewUser(String userId, String name, String email) {
User user = new User(name, email);

mDatabase.child("users").child(userId).setValue(user);
}

如果要更新特定字段,则需要使用方法updatechildren并使用库作为GSON或jackson将自定义对象包装在Json树中:

  HashMap<String, Object> updatedUserData = new HashMap<>();

                updatedUserData.put(PostsRepositoryImpl.this.getPeoplePath() + author.getUid() + "/" + Constants.FIREBASE_POST_PATH
                        + newPostKey, true);
                updatedUserData.put(PostsRepositoryImpl.this.getPostsPath() + groupKey + "/" + newPostKey,
                        new ObjectMapper().convertValue(newPost, Map.class));
                databaseReference.updateChildren(updatedUserData)

希望它能帮到你!

答案 1 :(得分:0)

我一直在为自己调查这个问题,我不相信它是开箱即用的,你可以做一些黑客攻击的事情并以一种看似不那么难看的方式封装它们,但我确信有更好的方法可以做到这一点。我现在不愿意更多地了解这一点。 作为解决方法我考虑了两个选项:

首先:您可以将所有数据作为json获取并使用Jackson(firebase也在引擎盖下使用)进行解析并观察异常

private TestParent getObjTestFromDataSnapshot(DataSnapshot dataSnapshot) throws NotATestObjInstanceException {
  ObjectMapper mapper = new ObjectMapper();
  GenericTypeIndicator<Map<String,Object>> indicator = new GenericTypeIndicator<Map<String, Object>>() {};
  try {
      return mapper.convertValue(dataSnapshot.getValue(indicator), TestChild1.class);
  } catch (UnrecognizedPropertyException e){
    //ignore exception?
  }
  try {
      return mapper.convertValue(dataSnapshot.getValue(indicator), TestChild2.class);
  } catch (UnrecognizedPropertyException e){
    //ignore exception?
  }
  thrown new NotATestObjInstanceException();
}

第二:它有点打败多态性的想法,我不确定它在你的情况下是否有用,但你可以将它存储在不同的分支中。宠物 - >狗,宠物 - >猫,宠物 - >等等