Android 跟踪一个对象';s在Firebase中的位置
使用Firebase存储和检索用户创建的对象(POJO)(例如:帖子或评论)时,有必要在应用程序中传递这些对象。但是,为跟踪此对象在数据库中关联的Android 跟踪一个对象';s在Firebase中的位置,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,使用Firebase存储和检索用户创建的对象(POJO)(例如:帖子或评论)时,有必要在应用程序中传递这些对象。但是,为跟踪此对象在数据库中关联的数据库引用、位置或唯一键,建议采用什么方法 示例场景 一个简单的待办事项列表应用程序允许用户自由添加、编辑和删除列表中的项目。因此,当用户创建一个项目时,会发生类似以下情况: private Item storeItem(String title) { String key = mDatabase.child("items").push().g
数据库引用
、位置或唯一键,建议采用什么方法
示例场景
一个简单的待办事项列表应用程序允许用户自由添加、编辑和删除列表中的项目。因此,当用户创建一个项目时,会发生类似以下情况:
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;
}
其中Item
是这个Java对象:
public class Item {
private String title;
private String description;
public Item() {}
public Item(String title) {
this.title = title;
}
// ...
}
在幕后,通过将返回的项目
插入适配器,或在触发附加到“items”引用的ChildEventListener
时,将此项目添加到RecyclerView
然后,用户希望重命名此新项目或将文本添加到说明
字段,因此在回收视图
中点击它将启动一个单独的活动
,该活动接收传递的项目
,并使用getter/setter进行更改
现在,我们需要将这些更改保存到数据库中,我们可以再次调用setValue()
,如上所述。但是,我们没有存储storeItem()
中的key
变量,因此我们实际上不知道该项当前存储在数据库中的什么位置
那么,我们在哪里可以跟踪所创建项的键,以便以后用于将更改保存回数据库
可能的解决方案
在这里我们可以采取许多不同的方法,但我正在寻找一些关于建议方法的指导,因为Firebase文档没有提到这个障碍。我列举了一些我能想到的例子:
- 将密钥存储在对象内。我们可以向
项添加另一个字段来存储数据库密钥。因此,在前面的
方法中,storeItem()
变量被添加到key
构造函数中,并作为字段存储在数据库中Item
- 创建一个包装器对象。我们可以将
对象包装在一个容器中,该容器具有项
和getItem()
或getKey()
等方法,然后将其传递给应用程序,而不是getDatabaseReference()
本身项
- 改为使用
。创建项后,等待连接的侦听器接收到它,然后使用并传递检索到的DataSnapshot
,它具有DataSnapshot
和getKey()
的方法getRef()
- 每次需要时检索对象。我们不必在应用程序中传递
,而是可以在每次需要时使用键或项
从数据库中检索对象数据库引用
因此,我想我的问题是:是否有一种标准方法来处理和更改存储在Firebase中的Java对象?我看到的大多数开发人员都在努力解决这一问题,最后也将密钥存储在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;
}
// ...
}
见:
在这种情况下,我个人的偏好是保持DataSnapshot
在附近。我在这方面看到的主要缺点是,快照对象类型的信息在我的代码中传播,因为这存在于多个地方:
snapshot.getValue(Item.class);
我一直在游说将DataSnapshot
类泛化,使其成为DataSnapshot
,这将解决这个问题。我认为FireStoreSDK中的JavaScript/TypeScript目前正在考虑这一点
但是,由于缺乏针对实时数据库的Android SDK的解决方案,您可能最好使用第一种方法:将密钥存储在Java对象中。我总是将密钥存储在对象中,只是我称它为id而不是key。不管怎样,一个独特的id总是很方便!谢谢@FrankvanPuffelen。我忘记了
@Exclude
,但将其用于此用途非常有意义。我一直在使用选项2,并使用通用容器包装对象,这也打开了添加方法的能力,例如save()
,以直接将更改保存回数据库。泛化DataSnapshot
是一个好主意,在某些方面类似于使用容器。是的,如果我必须做更大的项目,我可能也会选择这样的DTO。事实上:一个泛化的DataSnapshot
基本上已经过时了,尽管你的save()
方法仍然适合那里。好的,太好了!因此,目前还没有一个标准的方法,但是管理它主要取决于开发人员的偏好和可伸缩性。不过,将密钥存储在对象中可能是最简单的方法。再次感谢你的回答,如果没有其他问题,我会接受的。