setPersistenceEnabled(true)
启用的Firebase数据库持久性中存储的数据吗?
在我的应用程序中,我想在用户注销时清除数据库,并且他确认将删除不同步的更改。这个应用程序将被很多人在平板电脑上使用,每个用户会存储很多数据,所以我想清除设备上存储的不必要的数据到:
这是一个安全漏洞,因为任何用户,无论是否登录,都拥有对所有以前下载的数据的读取权限!幸运的是,我们没有写入权限。
我尝试在离线和在线模式下自行清除数据库,但数据仍然保留在设备上:
// 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"
}
}
}
}
不幸的是,没有支持的方法来清除持久性缓存。 您可以尝试手动删除 Firebase 数据库使用的 SQLite 数据库(应位于应用程序数据文件夹中的
/databases/
下),但您需要在初始化 Firebase 数据库之前执行此操作,因此您必须强制应用程序注销某人或类似情况后重新启动。
关于了解是否有“数据等待同步”,假设您正在谈论写入,唯一的方法是将 CompletionListener 附加到您执行的每个写入操作,并等待它们完成。
我们希望在 Firebase 数据库 SDK 的未来版本中改进这两点。
if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
((ActivityManager) getContext().getSystemService(ACTIVITY_SERVICE))
.clearApplicationUserData();
}
天哪,这个解决方案是多么可怕的黑客,我提前道歉......
这可以清除本地缓存:
禁用持久性
获取新节点的完整副本,例如对于用户 2
例如var copyData = wait (await ref.once()).value;
启用持久性
替换新节点,例如用户 2,使用 copyData
理论上只会写入已更改的数据,这应该意味着实时数据库不会发生任何更改。同时本地缓存会被服务器上的数据替换。
我采用这种方法来满足我的需求。它是解决方案的基础,根据每个用例的不同,它会有所不同。
祝你好运!
初始化数据库并在登录时附加侦听器,然后在注销时删除侦听器。这会启用本地缓存每个用户会话。
登录,
val dbListener = object: ChildEventListener {
override fun onChildAdded(...)
...
...
Firebase.database
.setPersistenceEnabled(true)
Firebase.database
.getReference("myNode")
.addChildEventListener(dbListener)
退出,
Firebase.database
.getReference("myNode")
.removeEventListener(dbListener)