setPersistenceEnabled(true)
启用的Firebase Database持久性中存储的数据?在我的应用程序中,我想在用户注销时清除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"
}
}
}
}
答案 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();
}
答案 2 :(得分:1)
答案 3 :(得分:0)
哦,天哪,这个解决方案真是太糟糕了,我提前道歉......
这可以清除本地缓存:
禁用持久化
获取新节点的完整副本,例如对于用户 2
例如var copyData = await (await ref.once()).value;
启用持久化
替换新节点,例如用户 2,使用 copyData
理论上只会写入已更改的数据,这意味着不会更改实时数据库。同时本地缓存被服务器端的数据替换。
我用这种方法来满足我的需求。它是解决方案的基础,具体取决于每个用例。
祝你好运!