使用Firebase存储和检索用户创建的对象(POJO)时(例如:帖子或评论),有必要在应用程序周围传递这些对象。但是,为此对象跟踪数据库中关联的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
对象包装在具有Item
和Item
或getItem()
等方法的容器中然后在应用程序周围传递它而不是getKey()
本身。getDatabaseReference()
。创建项目后,等待连接的侦听器收到它,然后使用并传递检索到的Item
,其中包含DataSnapshot
和DataSnapshot
。getKey()
。 {1}}。回顾这个巨大的问题,似乎我可能会稍微复杂一点,但我想彻底解释一下。我也希望它不是纯粹基于意见的,目前有一些标准的方法来实现这一目标。
所以我想我的问题是:是否有一种标准方法来处理和更改存储在Firebase中的Java对象?
答案 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对象中。