在Firebase中跟踪对象的位置

时间:2017-10-11 10:23:49

标签: android firebase firebase-realtime-database

使用Firebase存储和检索用户创建的对象(PO​​JO)时(例如:帖子或评论),有必要在应用程序周围传递这些对象。但是,为此对象跟踪数据库中关联的DatabaseReference,位置或唯一键的建议方法是什么?

示例场景

简单易用的列表应用允许用户自由添加,编辑和删除列表中的项目。因此,当用户创建项目时,会发生类似于下面的内容:

private Item storeItem(String title) {
    String key = mDatabase.child("items").push().getKey(); // Where do we keep this key?
    Item item = new Item(title);

    mDatabase.child("items").child(key).setValue(item);

    return item;
}

这个Java对象Item的位置:

public class Item {
    private String title;
    private String description;

    public Item() {}

    public Item(String title) {
        this.title = title;
    }

    // ...
}

在幕后,通过将返回的RecyclerView插入适配器或者触发附加到“items”引用的Item,此项目将添加到ChildEventListener

然后,用户希望重命名此新项目或向description字段添加文字,因此在RecyclerView点击它会启动一个单独的Activity接收传递的{{1}并使用getters / setters进行更改。

现在,我们需要将这些更改保存到数据库中,我们可以通过再次调用Item来执行此操作,如上所述。但是,我们没有存储来自setValue()的{​​{1}}变量,因此我们实际上并不知道此项目当前存储在数据库中的位置。

那么,我们在哪里可以跟踪创建的项目的密钥,以便以后用于将更改保存回数据库?

可能的解决方案

我们可以在这里采用许多不同的路径,但我正在寻找有关建议方法的一些指导,因为Firebase文档没有提到这个障碍。我已经概述了一些我能想到的例子:

  • 将密钥存储在对象中。我们可以在key对象中添加另一个字段来存储数据库密钥。因此,在之前的storeItem()方法中,Item变量将添加到storeItem()构造函数中,并作为字段存储在数据库中。
  • 创建包装器对象。我们可以将key对象包装在具有ItemItemgetItem()等方法的容器中然后在应用程序周围传递它而不是getKey()本身。
  • 改为使用getDatabaseReference()创建项目后,等待连接的侦听器收到它,然后使用并传递检索到的Item,其中包含DataSnapshotDataSnapshot
  • 每次需要时都会检索对象。我们可以通过使用密钥或{在每次需要时从数据库中检索它,而不是在应用程序周围传递getKey()。 {1}}。

结束

回顾这个巨大的问题,似乎我可能会稍微复杂一点,但我想彻底解释一下。我也希望它不是纯粹基于意见的,目前有一些标准的方法来实现这一目标。

所以我想我的问题是:是否有一种标准方法来处理和更改存储在Firebase中的Java对象?

1 个答案:

答案 0 :(得分:2)

我认为最困难的开发人员最终将密钥存储在Java对象中。为了防止它在JSON中重复,您可以在Java类中对其进行注释:

public class Item {
  private String title;
  private String description;
  @Exclude
  public String key;

  public Item() {}

  public Item(String title) {
    this.title = title;
  }

  // ...
}

请参阅:Is there a way to store Key in class which I cast from Firebase object?

在这种情况下,我个人的偏好是保持DataSnapshot左右。我看到的主要缺点是快照的对象类型的信息在我的代码上散布,因为它存在于多个地方:

snapshot.getValue(Item.class);

我一直在游说,要求DataSnapshot课程化,以便它成为DataSnapshot<Item>,这将解决这个问题。我认为目前正在考虑使用Firestore SDK for JavaScript / TypeScript。

但是对于实时数据库的Android SDK缺乏这样的解决方案,您可能最好采用第一种方法:将密钥存储在Java对象中。

相关问题