注销后清除firebase持久性

时间:2016-07-09 12:22:33

标签: android firebase firebase-realtime-database

  1. 有没有办法清除通过setPersistenceEnabled(true)启用的Firebase Database持久性中存储的数据?
  2. 或最终阻止对设备上先前存储的用户数据的读取权限?
  3. 还有一个问题 - 有没有办法检查是否有任何数据等待同步?
  4. 在我的应用程序中,我想在用户注销时清除db,并确认将删除未同步的更改。此应用程序将在平板电脑上被许多人使用,并且每个用户将存储许多数据,因此我想清除存储在设备上的不必要数据

    • 缩减存储空间使用量
    • 防止未经授权的人员读取用户数据

    这是一个安全漏洞,因为任何用户,无论是否登录,都可以读取所有以前下载的数据!幸运的是我们没有写入访问权限。

    我尝试在离线和在线模式下自行清除数据库,但数据仍然存在于设备上:

    // first clear all data on my own
    FirebaseDatabase db = FirebaseDatabase.getInstance();
    db.goOffline(); // even when I clear db in online mode data persist on mobile device
    db.getReference().setValue(null);
    
    // and then logout
    FirebaseAuth.getInstance().signOut();
    db.goOnline();
    

    例如数据结构:

    {
      "someList": {
        "userId1": {
          "itemId11": {
            "name": "name 11"
          },
          "itemId12": {
            "name": "name 12"
          },
          ...
          "itemId1N": {
            "name": "name 1N"
          }
        }
        "userId2": {
          "itemId21": {
            "name": "name 21"
          },
          "itemId22": {
            "name": "name 22"
          },
          ...
          "itemId2N": {
            "name": "name 2N"
          }
        }
      }
    }
    

    我的规则:

    {
      "rules": {
        ".read": "false",
        ".write": "false",
        "someList": {
          "$uid": {
            ".read": "$uid === auth.uid",
            ".write": "$uid === auth.uid"
          }
        }
      }
    }
    

4 个答案:

答案 0 :(得分:11)

不幸的是,没有支持的方法来清除持久性缓存。您可以尝试手动删除Firebase数据库使用的SQLite数据库(应该位于应用程序数据文件夹中的/databases/下),但是在初始化Firebase数据库之前需要执行此操作,因此您需要#39; d必须在签署某人或类似人员后强制重启应用程序。

关于知道是否有等待同步的数据",假设您正在谈论写入,唯一的方法是将CompletionListeners附加到您执行的每个写操作,并等待他们完成。

这些都是我们希望在Firebase数据库SDK的未来版本中改进的内容。

答案 1 :(得分:2)

    if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) getContext().getSystemService(ACTIVITY_SERVICE))
                .clearApplicationUserData();
    }

source

答案 2 :(得分:1)

clearPersistence()v6.2.0中启动。

通过

https://github.com/firebase/firebase-js-sdk/issues/449

答案 3 :(得分:0)

哦,天哪,这个解决方案真是太糟糕了,我提前道歉......

这可以清除本地缓存:

  • 禁用持久化

  • 获取新节点的完整副本,例如对于用户 2

例如var copyData = await (await ref.once()).value;

  • 启用持久化

  • 替换新节点,例如用户 2,使用 copyData

理论上只会写入已更改的数据,这意味着不会更改实时数据库。同时本地缓存被服务器端的数据替换。

我用这种方法来满足我的需求。它是解决方案的基础,具体取决于每个用例。

祝你好运!