【问题标题】:How to show an error when Firebase Realtime Database denies access?Firebase 实时数据库拒绝访问时如何显示错误?
【发布时间】:2020-07-07 10:43:15
【问题描述】:

我的应用从我的 Firebase 数据库中检索数据。检索到的数据在 TextView 中查看。在检索 TextView 之前只显示提示(此处为用户名)。

在 Firebase 数据库中编写规则时,我将“.read”和“.write”都设置为 FALSE。这意味着没有人可以访问数据。

但是我的 TextView 仍然显示提示。如何在应用程序中获得拒绝访问的响应,以便我可以创建一个声明访问被拒绝的弹出窗口。

有什么方法可以得到这样的确认?

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

所以当我的规则如上。 输出是:

但是当我将规则更改为

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

输出是:

所以用户认为他的现金仍在加载,但我想向他显示一个拒绝访问的错误。有什么办法吗?

我的代码:

String cashOwnValue = "start";
try {
    cashOwnValue = dataSnapshot.child("startCash").getValue().toString();
} catch (Throwable e) {
    Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
cashValue.setText(cashOwnValue);
Toast.makeText(getApplicationContext(), "Your balance has changed.", Toast.LENGTH_SHORT).show();

编辑: 当访问被拒绝时,要让用户知道他的请求已被拒绝,您必须编写以下代码:

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
    Toast.makeText(getApplicationContext(), "Access Denied", Toast.LENGTH_LONG).show();
}

为了避免在未找到用户数据时应用崩溃,您可以使用 try-catch 块,如下所述。 (这也需要与@PrajwalW 进行长时间的讨论才能解决)。

【问题讨论】:

  • 在此处粘贴您的 fb 规则逻辑。另外,只需将您的写入设置为 FALSE 并将读取设置为 True...
  • 另外,你可以做一个快速逻辑,如果 fb rtdb 对象值为空,则显示一个弹出窗口。
  • 请编辑问题以显示所有相关规则,以及执行未按预期方式运行的查询的代码。我们应该能够根据您提供的内容复制问题。
  • @PrajwalW 我添加了规则和截图。
  • 参考我的 cmets 你会得到答案..

标签: android firebase firebase-realtime-database firebase-security


【解决方案1】:

这里有一个完整的单一解决方案:

  1. 使读 = 真,写 = 假。这将只允许读取访问,并在写入访问时返回 Permission denied。
  2. 要处理该错误:使用 try - catch 块来执行。
  3. 在 try 块中编写您的代码,在 catch 块中处理您的异常。
  4. 根据您的情况,您希望在用户尝试编辑字段时显示错误或默认文本。为此,在您的 catch 块中编写该代码。
  5. 现在您的新文本错误消息没有更新:

进行此更改:

字符串 cashOwnValue = null; //全局设置为null初始值。

        try {
            cashOwnValue = "start";
            cashOwnValue = dataSnapshot.child("startCash").getValue().toString();
            cashValue.setText(cashOwnValue);  //add the setText() inside the try block like this...
        Toast.makeText(getApplicationContext(), "Your balance has changed.", Toast.LENGTH_SHORT).show();

        } catch (Throwable e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }

【讨论】:

  • 没有。 . 添加 setText();在 try 块中说 Variable 'cashOwnValue' initializer '"start"' is redundant .. 并且不会工作。
  • 如果我不初始化它说的字符串error: variable cashOwnValue might not have been initialized
  • 你的意思是代码顶部的公共字符串??没用
  • 伙计.....你想做什么?用一行来解释 try 块有什么用!还要粘贴代码而不是图像...
  • 字符串初始化为“开始”。从 firebase 数据库中检索数据时。字符串应该保存检索到的数据值,而不是“开始”。我想将字符串的值从“开始”更改为 dataRetrieved
猜你喜欢
  • 2021-02-10
  • 2013-03-18
  • 2012-06-07
  • 2011-01-20
  • 1970-01-01
  • 2020-11-25
  • 2020-12-29
  • 2018-12-12
相关资源
最近更新 更多