我有一个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数据库的本地副本,但不将该部分同步到远程吗?,这样我就可以避免使用单独的数据存储
答案 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的全部功能的同时允许更健壮的数据库访问。