注销后清除 firebase 持久性

问题描述 投票:0回答:5
  1. 有什么方法可以清除通过setPersistenceEnabled(true)启用的
    Firebase数据库
    持久性中存储的数据吗?
  2. 或者最终阻止对设备上以前存储的用户数据的读取访问?
  3. 还有一个额外的问题 - 有什么方法可以检查是否有任何数据正在等待同步?

在我的应用程序中,我想在用户注销时清除数据库,并且他确认将删除不同步的更改。这个应用程序将被很多人在平板电脑上使用,每个用户会存储很多数据,所以我想清除设备上存储的不必要的数据到:

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

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

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

// 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"
      }
    }
  }
}
android firebase firebase-realtime-database
5个回答
12
投票

不幸的是,没有支持的方法来清除持久性缓存。 您可以尝试手动删除 Firebase 数据库使用的 SQLite 数据库(应位于应用程序数据文件夹中的

/databases/
下),但您需要在初始化 Firebase 数据库之前执行此操作,因此您必须强制应用程序注销某人或类似情况后重新启动。

关于了解是否有“数据等待同步”,假设您正在谈论写入,唯一的方法是将 CompletionListener 附加到您执行的每个写入操作,并等待它们完成。

我们希望在 Firebase 数据库 SDK 的未来版本中改进这两点。


4
投票

clearPersistence()
v6.2.0推出。

通过

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


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

来源


0
投票

天哪,这个解决方案是多么可怕的黑客,我提前道歉......

这可以清除本地缓存:

  • 禁用持久性

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

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

  • 启用持久性

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

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

我采用这种方法来满足我的需求。它是解决方案的基础,根据每个用例的不同,它会有所不同。

祝你好运!


0
投票

初始化数据库并在登录时附加侦听器,然后在注销时删除侦听器。这会启用本地缓存每个用户会话

登录,

val dbListener = object: ChildEventListener {
    override fun onChildAdded(...)
    ...

...

Firebase.database
    .setPersistenceEnabled(true)

Firebase.database
    .getReference("myNode")
    .addChildEventListener(dbListener)

退出,

Firebase.database
    .getReference("myNode")
    .removeEventListener(dbListener)
© www.soinside.com 2019 - 2024. All rights reserved.