是否有可能成为Firebase实时数据库结构的一部分,仅限本地

时间:2018-09-09 19:14:02

标签: java android firebase firebase-realtime-database

我有一个Firebase实时数据库,该数据库具有类似于以下的多对多结构:

App {
   "users" : {
        "user123" : {
            "name" : "Mr Guy"
            ...
            "groups" : {
                "group567" : true,
                "group890" : true
            }
        }
    }
    "groups" : {
        "group567" : {
            "name" : "My Group 1",
            "other" : "some other random stuff",
            "logs" : {
                 "guid345" : {
                     "author" : "Miss Other",
                     "note" : "some change note"
                 },
                 "guid817" : { ... },
                 "guid018" : { ... },
                 ...
             },
             "members" : {
                 "user123" : true,
                 ...    
             }
        }
    }
}

这些已映射到某些对象:

class User {
    private String name;
    private List<Groups> groups;
}

class Group {
    private String name;
    private Other other;
    private List<Log> logs;
}

class Log {
    private String author;
    private String note;
}

我现在要优化下载的数据量。 (每个组的日志节点与用户无关,除了在用户处于活动状态时添加的项目外-这意味着期望每个用户将看到不同的日志列表。)

我知道如何忽略日志字段,而不将其发送到Firebase-我有一个实现,其中我将日志分别保存在sqlite中,而不是手动进行操作有没有一种方法来设置要保存的属性Firebase数据库的本地副本,但不将该部分同步到远程吗?,这样我就可以避免使用单独的数据存储

2 个答案:

答案 0 :(得分:3)

Firebase实时数据库没有“仅本地”数据的含义。一切尽早同步。

如果您需要本地关系数据库,请考虑研究Android Jetpack's Room-它提供了您所要查找的信息。

答案 1 :(得分:1)

Firebase实时数据库或新的Cloud Firestore数据库的主要目标是实时工作,而不是作为脱机数据库工作。即使您的应用程序暂时失去了网络连接,Firebase应用程序也可以正常工作。脱机时可以使用缓存的数据,并且在恢复网络连接后,Firebase会重新发送所有写入操作。

启用磁盘持久性后,您的应用程序会将数据本地写入设备,以便您的应用程序可以在脱机时保持状态。您可以使用以下代码行来启用磁盘持久性:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

如果您想完全保密,可以使用FirebaseDatabase的goOffline()方法:

  

此方法将关闭与Firebase数据库后端的连接,直到调用goOnline()。

但是,我不建议您将Firebase实时数据库用作仅脱机数据库。它实际上是作为在线数据库设计的,可以在断开连接的短到中期内工作。如果要使用仅脱机数据库,还可以使用其答案中提到的@Doug Stevenson Room Library

  

Room持久性库在SQLite上提供了一个抽象层,以在利用SQLite的全部功能的同时允许更健壮的数据库访问。