【问题标题】:Permission Denied to Firebase RealTime DatabaseFirebase 实时数据库的权限被拒绝
【发布时间】:2023-09-18 16:17:01
【问题描述】:

我正在尝试按照 Firebase 的在线指南使用 Firebase 实时数据库,但由于我的权限被拒绝,我无法获取数据库的任何更新。我不确定我做错了什么。我什至设置了读写规则为真。

onClickListener里面的代码如下:

Button vDetails = (Button) v.findViewById(R.id.enter_vechile_details);
vDetails.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
        myRef.child("Customers").child("Drivers").setValue("Name").addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "signUp: set customer name" + e);
                e.printStackTrace();
            }
        });
        getFragmentManager().beginTransaction().replace(R.id.fragment_container, new SignUpCustomerFragment()).commit();
    }
});

这是在片段内,按钮在开始片段替换事务之前首先完成这些语句。

这是 Firebase 中的规则:

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

由于我是 JSON 新手,我也尝试过在“.write”末尾添加逗号

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

这是堆栈跟踪:

09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err: com.google.firebase.database.DatabaseException: Firebase Database error: Permission denied
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at com.google.firebase.database.DatabaseError.toException(Unknown Source)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at com.google.android.gms.internal.zzall$1.onComplete(Unknown Source)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at com.google.android.gms.internal.zzahq$20.run(Unknown Source)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at android.os.Looper.loop(Looper.java:168)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5885)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection
09-10 04:32:46.274 16594-16594/com.buildingstories.sabbib.xpose W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
09-10 04:32:46.276 16594-16594/com.buildingstories.sabbib.xpose W/IInputConnectionWrapper: getTextAfterCursor on inactive InputConnection

自从我遵循 Firebase 指南以来,我整天都在做这件事,我不知道出了什么问题。

【问题讨论】:

  • addOnFailureListener 附加到myRef.setValue() 以查看您遇到了什么错误。
  • 从 Firebase 控制台向您发布客户类代码和实时数据库结构
  • 很可能您没有写入数据的权限。在how to detect errors when writing a value on Android 上阅读此说明
  • 你说得对,我没有得到许可。我已经设置了允许读取和写入数据的规则,但它仍然不允许我。我能做些什么来进一步调试它?我有一个 printStackTrace,但没有充分利用它@FrankvanPuffelen
  • 参考这个链接它会为我工作*.com/a/37404116/4427519

标签: android android-fragments firebase firebase-realtime-database permission-denied


【解决方案1】:

您需要为“驱动器”创建一个子级并按以下代码推送客户类,并记住在您的客户类中创建空构造函数:

       FirebaseDatabase database = FirebaseDatabase.getInstance();
       DatabaseReference myRef = database.getReference("Drivers");

       Customer customer = new Customer();
       customer.setFirstName(fullName.getText().toString());//fullName is EditText

       myRef.child("drive").push().setValue(customer);

【讨论】:

    【解决方案2】:

    您应该使用HashMap 来推送您的值并添加onFailureListener,这样您就可以看到error 得到了什么:

     FirebaseDatabase database = FirebaseDatabase.getInstance();
           DatabaseReference myRef = database.getReference("Drivers");
    
           Customer customer = new Customer();
           customer.setFirstName(fullName.getText().toString());//fullName is EditText
    
           Map<String,Object> map = new HashMap<String,Object>();
           map.add("drive",customer);
    
           myRef.push().setValue(map).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                e.printStackTrace();
            }
        });
    

    注意:确保Customer 类有一个空的构造函数,否则Firebase 将无法Serialize 你的类。

    【讨论】:

      【解决方案3】:

      您已在子项中设置主题以更新值

      构造函数中的传递值不要设置。

      Customer customer = new Customer(fullName.getText().toString()); // Pass values here in constructor
      //customer.setFirstName(fullName.getText().toString());
      
      myRef.child("Drivers").setValue(customer);
      

      【讨论】:

      • 我正在做,但什么也没做:/
      • 直接在构造函数中设置值
      【解决方案4】:

      以下代码会将 Drivers 类设置为“驱动器” .

      DatabaseReference db = FirebaseDatabase.getInstance().getReference();
      
      db.child("Drivers").setValue("drive");
      

      请注意,push() 和 setValue() 是不同的。您可以阅读有关在实时 Firebase 数据库中保存数据的更多信息here

      【讨论】:

      • 请检查编辑,这是一个权限问题@pastillas
      最近更新 更多