Firebase模型的糟糕实施会带来大量数据:希望提出更好的建议

时间:2019-03-06 12:16:24

标签: android firebase hashmap

我有一个可以同时在多个设备上运行的应用程序。有些服务器可能会在某些时候脱机,并且将在它们重新联机时推送数据。但是,我设置对象的方式不是最佳的,这意味着存在大量冗余数据提取和速度问题。

该应用程序特定于特定行业,因此我无法粘贴真实代码。我使用Foo和Baa这两个类来说明我的问题。

我有一个定义如下的对象:

class Foo() {
HashMap(String, Baa) BaaHashMap;
String fooName;
}

class Baa() {
String baaName;
Integer baaValue;
}

初始化对象:

private Foo returnInitialisedFoo() {
private Foo foo = new Foo();
HashMap<String, Baa> baaHashMap = new Hashmap();

for (int i = 0 to 100) {
baaHashMap.put("Number" + String.ValueOf(i), new Baa);
}

foo.baaHashMap = baaHashMap;

return foo;
}

我在Foo上设置了Firebase ValueEventListener。当用户对HashMap中的任何Baa对象进行更新时,我只会将更改的Baa中的属性推送到Firebase:

if (baaNameChanged) {
getInstance().child(path).setValue(baaNameProperty); }

if(baaValueChanged) {
getInstance().child(path).setValue(baaValueProperty); }

将有两类人同时使用该应用程序。一个类别将仅更新baaName属性。其他类别将仅更新baaValue属性。

我之所以将属性一一推送是因为以下在线/离线情况:-

将向所有用户显示一个带有Baa对象列表的视图(从包含上面在returnInitialisedFoo()中初始化的100个值的列表)。将会从列表中选择要更新的Baa对象。

具有在线设备的用户将继续使用Baa名称更新大量Baa对象。数据将与Firebase同步。

但是,还有一个用户正在从离线设备更新baaValues。如果我推动整个Baa对象,则当设备在线时,他数据中的空baaNames将覆盖第一个家伙的数据。

单独更新值的问题如下: 我有一个来自Firebase的ValueEventListener,当它看到对在线Foo对象的任何更改(来自任何设备上的任何用户)时都会触发。在实际应用中,Baa类的等效项大约有8或9个值,这些值将分别更新。因此,值事件侦听器将Foo对象拉8或9次,因为在Firebase中更新了更改(在一个屏幕上,用户更新了值,然后按保存按钮将所有更改的属性推入数据到Firebase)。

这正在提取大量数据。这也意味着更新接口以反映新值会存在很大的延迟(对于较大的Foo,大约需要2秒)。

我肯定想念一些明显的东西-我将不胜感激对此的建议。我也查看了Firebase事务,看看是否可以一次推送完整的Baa,但是看起来我仍然会遇到数据被覆盖的情况。

目前,我正在考虑在设备上的内存中保留Foo的本地副本,以用于填充接口。用户所做的任何更改都将同时更新到内存中的Foo,并推送到Firebase。

然后,我将仅每5秒钟左右用ValueEventListener中的更改更新本地Foo。

我不喜欢这种方式,因为它看起来可能会出现很多问题。

如果有一个知识渊博的人可以提供帮助,我将非常感激!

0 个答案:

没有答案