Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 跟踪一个对象';s在Firebase中的位置_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 跟踪一个对象';s在Firebase中的位置

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

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

示例场景 一个简单的待办事项列表应用程序允许用户自由添加、编辑和删除列表中的项目。因此,当用户创建一个项目时,会发生类似以下情况:

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()
方法仍然适合那里。好的,太好了!因此,目前还没有一个标准的方法,但是管理它主要取决于开发人员的偏好和可伸缩性。不过,将密钥存储在对象中可能是最简单的方法。再次感谢你的回答,如果没有其他问题,我会接受的。