【问题标题】:Force data sync with firebase server from Android强制数据与 Android 的 firebase 服务器同步
【发布时间】:2016-04-18 18:49:01
【问题描述】:

我正在开发一个具有 sqlite 数据库的 Android 应用程序。我想为数据库添加一些云服务和跨同一用户的多个设备的同步。会有登录机制,不同用户的数据会有所不同。同步将仅适用于登录用户。对于其他人,数据将仅驻留在本地。

我发现 firebase 非常有趣,并开始添加它以进行同步。我无法用 firebase 完全替换 sqlite,因为我需要为未登录的用户提供离线体验。

我为同步操作实现了同步适配器。我正在那里进行 sqlitefirebase 双向同步。

我正在使用 firebase 事务来避免来自多个设备的冲突。但我读到 Firebase Android 最初是在离线数据库上写入的,并在以后与服务器同步。这可能会导致事务失败,有时会导致数据不一致。而且我认为事务不会在应用重启时得到维护。

如果有一个选项可以禁用 firebase 的离线功能,并且每个请求都会立即发送到服务器并以成功完成或失败结束,我可能能够在此处正确实现同步。

那么有没有办法强制直接从服务器写入和读取? 有没有更好的方法来确保跨多个设备的良好冲突处理? firebase 不适合这个目的吗?

【问题讨论】:

  • 文本太多,代码不够。但是有几件事:“我需要为未登录的用户提供离线体验”。 Firebase 不需要用户登录。如果您担心识别用户,可以使用anonymous authentication
  • “有没有办法强制直接从服务器写入和读取?”。 Detect if the user is connected to Firebase,然后才写。
  • “如果有一个选项可以禁用 firebase 的离线功能,并且每个请求都会立即发送到服务器并以成功完成或失败完成”听起来您正在寻找 completion listener
  • 嘿 @FrankvanPuffelen 感谢您的 cmets。对不起,很长的文字。我没有添加代码,因为我正在寻求解决我的设计问题。匿名身份验证会离线工作吗?无论用户是否连接到网络,我能否确保匿名用户的所有数据都可以离线使用(就像 sqlite 一样)。我认为可以在 firebase 中离线保存的数据量是有限的。
  • 即使我检查连接状态并进行写入,是否保证连接持续到操作完成?基本上我不希望数据离线保存(使用 sqlite + firebase 时)它应该写入服务器或失败并对此进行回调,以便我可以跟踪它。如果在没有 FirebaseError 的情况下调用了一个完整的侦听器,我可以假设到那时数据已写入服务器吗?如果没有连接会失败吗?

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


【解决方案1】:

如果有人仍在寻找解决方案。

最初使用 firebaseRef.addValueEventListener() 时,它会从可用缓存中加载数据,然后从服务器请求更新数据。

为了检索最新的服务器端数据,我们确保用户连接到互联网并连接到 Firebase 服务器数据库。

        DatabaseReference connectionRefrence;
        ValueEventListener connectionValueEventListener;

        connectionRefrence = FirebaseDatabase.getInstance().getReference(".info/connected");
        connectionValueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                boolean connected = dataSnapshot.getValue(Boolean.class);
                if (connected) {
                    printLog("connected");
                    // TODO :: Perform your operation here with live data

                } else {
                    printLog("not connected");
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                printLog("connection cancelled");

            }
        };

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多