Android 注销后清除firebase持久性 有没有办法通过设置persistenceenabled(true)清除存储在persistenceenabled中的数据 或者最终阻止对设备上以前存储的用户数据的读取访问 还有一个额外的问题——有没有办法检查是否有数据正在等待同步

Android 注销后清除firebase持久性 有没有办法通过设置persistenceenabled(true)清除存储在persistenceenabled中的数据 或者最终阻止对设备上以前存储的用户数据的读取访问 还有一个额外的问题——有没有办法检查是否有数据正在等待同步,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在我的应用程序中,我想在用户注销时清除数据库,并确认将删除未同步的更改。很多人都会在平板电脑上使用此应用程序,每个用户都会存储很多数据,因此我想清除设备上存储的不必要数据,以便: 减少存储使用 防止未经授权的人读取用户数据 这是一个安全漏洞,因为任何用户,无论是否登录,都有权读取以前下载的所有数据幸运的是,我们没有写访问权限 我尝试在脱机和联机模式下自行清除db,但数据仍保留在设备上: //首先自己清除所有数据 FirebaseDatabase db=FirebaseDatabase.get

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

  • 减少存储使用
  • 防止未经授权的人读取用户数据
这是一个安全漏洞,因为任何用户,无论是否登录,都有权读取以前下载的所有数据幸运的是,我们没有写访问权限

我尝试在脱机和联机模式下自行清除db,但数据仍保留在设备上:

//首先自己清除所有数据
FirebaseDatabase db=FirebaseDatabase.getInstance();
db.gouffline();//即使在联机模式下清除db,数据仍会在移动设备上保留
db.getReference().setValue(null);
//然后注销
FirebaseAuth.getInstance().signOut();
db.goOnline();
eg数据结构:

{
  "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数据库之前执行此操作,因此您必须在注销某人或类似用户后强制重新启动应用程序

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

如果(Build.VERSION\u CODES.KITKAT
clearPersistence()
于年推出,我们希望在Firebase数据库SDK的未来版本中改进这两个方面

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


你试过
mRef.keepSynced(false);
@SahajRana不幸的是,在任何地方添加
keepSynced(false)
都不会改变任何东西。只有当我删除最后一个
db.goOnline()
时,我才真的无法读取以前的用户数据。但我可以以“注销”的方式写入和读取新数据当我调用
db.goOnline()
(使数据库同步)登录后,它将清除后端上的所有旧数据,同时tame将添加新数据作为“注销”用户。实际上,当您设置
setPersistenceEnabled(true)时
firebase将数据以缓存形式存储在您的设备上,以便在脱机时显示数据。您是否可以显示更多关于您正在尝试执行的操作的代码。以及您希望不执行的操作。
setPersistenceEnabled(true)
还可以对脱机时执行的请求进行备份,并在下次来时执行online@MichaelLegenbauer-那么…这方面有什么进展吗?@michael lehenbauer这方面有什么新进展吗?由于firebase限制在离线时终止应用程序时丢失挂起的更改,我看到本地缓存脱离了syn没有明显的解决方法。清除缓存的方法是一种很好的回退方法。您可以使用keepSync(true)你知道我会如何在iOS中做类似的事情吗?你能在注销时使用
clearPersistence
吗?我已经尝试了几种方法,但无法停止应用程序。来自Android SDK的
terminate
似乎还不在JS SDK中。我需要停止应用程序,以便允许执行
clearPersistence
。这里有一个few应该在这个答案中解释的警告-检查文档:考虑之后,我读到的最好建议是,如果需要清除缓存,就不要使用持久性。问题是关于实时数据库,而不是firestore