【问题标题】:Use Firebase DB with local DB将 Firebase 数据库与本地数据库一起使用
【发布时间】:2016-12-26 00:53:13
【问题描述】:

在我的应用程序中,我有 SQLite db。我想在我的用户的设备之间引入同步。 Firebase DB 看起来是一个可以接受的解决方案,但 Firebase DB 一开始是云数据库。因此,如果用户拒绝身份验证对话框并让他使用应用程序,但没有云同步,我不能将其用作本地数据库。

现在我考虑将我的local SQLite dbcloud Firebase db 结合起来。

例如,当用户向local SQLite db 添加新行时,我的应用程序也会将数据放入Firebase DB。此用户的其他设备将捕获此事件并更新其本地数据库。当用户使用身份验证并在新设备上安装应用程序时,我希望它下载所有行并将它们放入local SQLite db。这就是我的想法:使用Firebase DB only 来同步数据,而不是将其存储在设备上。主要原因是让用户在没有身份验证和同步的情况下使用我的应用程序。第二个是that Firebase DB 不是为本地db 设计的。

我是对的? 可以将 Firebase 数据库与另一个本地数据库一起使用吗?

相关问题:

link他想要的和我想要的一样:

我的计划是为用户提供保持离线状态的选项

【问题讨论】:

  • 如果你想同步Couchbase提供了一个不错的选择。
  • 您似乎不是在寻找在线/同步的数据库,而是更多地寻找保证交付的消息传递系统。虽然您可以在 Firebase(可能还有任何其他命名数据库)之上构建这样的消息传递系统,但寻找更直接适合您的用例的可能会更好。不过,在 Stack Overflow 上推荐一个库是题外话。
  • 但如果您打算在 Firebase 上构建它,这并不难。您需要弄清楚您的删除标准:何时从云中删除数据。您可以在某个超时后执行此操作,一旦您确认所有其他用户都已获取数据,或两者兼而有之。
  • @FrankvanPuffelen 我的想法是:我不想从云中删除数据。我想使用Firebase DB 作为本地的影子数据库。

标签: android firebase android-sqlite firebase-realtime-database firebase-authentication


【解决方案1】:

HTML5 混合应用的一些选项

这不是 OP 所问的,但希望对一些寻求者有用。

您可以使用客户端和服务器数据库的任意组合来实现将远程维护的数据存储在设备中,以便在离线时可用。


一些客户端选项:

一些服务器选项:

【讨论】:

  • 我不确定这个答案是否适用于本机应用程序或如何同步 SQLite 数据库
  • @user1290746 谢谢! PouchDB/CouchDB 看起来不错,但我不想启动自己的服务器,因为我现在可以使用 Firebase。此外,PouchDroid 的最后一次提交是在 2014 年。我不能依赖代码,在没有任何作者支持的情况下在 WebView 中运行,因为我不是 JS 开发人员。
  • 对不起@Alexandr & cricket_007 - 我看到 Sqlite 并认为它是混合代码。
【解决方案2】:

如果你的 firebase 结构不是太复杂,你也可以创建一个接口来定义像

这样的方法
void addData(Data data);
Data getData(long id);
void editData(Data data, long id);
void deleteData(long id);

然后创建 2 个实现该接口的类,一个使用 Firebase,另一个使用 SQLite。

DatabaseImplementation
FirebaseImplementation

在您的 Firebase 实施中,您可以像往常一样发布数据,并将一个新节点发布到 root/requestUpdate/userId/push/ 之类的地方,并且 push 将包含有关您请求更新的何处以及什么deviceId 已发布。

然后将 ValueEventListener 绑定到该节点,如果它有一个新的子节点,请查看 deviceId 是否相同。如果不是,让 FirebaseImplementation getData 使用您获得的信息,然后使用 DatabaseImplementation,以 addData.

这将确保无论何时进行更改,任何其他登录的客户端都会知道更新其 firebase。如果客户端不在线,下次他将在线时,他将在附加时触发 ValueEventListener 执行此操作。确保遍历所有请求的更新以确保全部完成。还将您完成的任何更新的推送密钥存储在本地数据库中,这样您最终不会多次更新。

基本上,firebase 将始终保持最新状态,并将用户在单独节点上所做的任何更改存储在所有客户端都侦听的节点上。

显然,该解决方案仍有许多问题需要解决,例如确定何时删除 requestUpdate 节点。从逻辑上讲,在每个用户都同步之后,但是您如何确定这一点? ...

对于第一次登录,您需要编写一个 populateDatabaseFromFirebase() 方法,该方法将执行大量的 getDatas 和 addDatas。您将如何做到这一点取决于您的数据库的外观。然后,您将存储用户已经使用 SharedPreferences 和 firebase UID 登录。

话虽如此,这只有在你的火力基础相当平坦的情况下才有效。如果您有一个复杂的数据库,那么一切都会变得更加复杂和纠缠不清,然后可能值得研究一个外部库。

【讨论】:

  • 您的意思是我必须使用Firebase DB 来存储和共享“数据已更改”event 对象?我的想法是将它用作本地数据库的影子数据库。并将任何其他经过身份验证的用户设备的本地数据库与此 Firebase DB 同步。即使在第一次登录之后。
  • 是的,这正是创建 requestUpdate 节点的重点。如果您将项目添加到“数据库”,则使用 FirebaseImplementation 和 DatabaseImplementation 保存它。任何其他用户都会通过 requestUpdate 节点看到 Firebase 中的数据已更改,并且可以自动将更改下载到他的本地数据库
猜你喜欢
  • 2017-12-11
  • 2020-09-01
  • 2011-10-17
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
相关资源
最近更新 更多