Firebase:Setvalue使用地图对象但不使用POJO

时间:2017-08-10 11:03:55

标签: android firebase firebase-realtime-database

我不知道,为什么Setvalue()与map对象(静态数据)一起使用,并且在将普通java对象与动态数据(POJO)一起使用时,将权限拒绝为异常。

作品: 使用Map对象保存数据

Map newUserData = new HashMap();
            newUserData.put("Name", getUserName());
            newUserData.put("Surname",getUserName()+"_testSurname");
            newUserData.put("Gender","Gender_data");
            newUserData.put("PhotoURL","");

添加元数据失败com.google.firebase.database.DatabaseException:Firebase数据库错误:权限被拒绝

使用POJO保存数据

public class MetaInfo {

private String Name, Surname,Gender,PhotoURL;

public MetaInfo() {}

public MetaInfo(String name, String surname, String gender, String photoURL) {
    Name = name;
    Surname = surname;
    Gender = gender;
    PhotoURL= photoURL;
}

public String getPhotoURL() {
    return PhotoURL;
}
...
...
..

使用MetaInfo对象添加数据:

MetaInfo mData= new MetaInfo(name.getText().toString(),
                surname.getText().toString(),
                gender.getText().toString(),
                "");

使用map对象调用setvalue()可以正常工作,使用具有有效数据的MetaInfo对象时的权限。

DatabaseReference.child(getUid()).child("metadata").setValue(mData).addOn CompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    Log.i(TAG,"metadata added ");
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.i(TAG,"adding metadata failed "+e.toString());
                }
            });
                @Override

FB-规则

 rules": {
  "test":{
    "$UID":{
      // METADATA
      "metadata":{
        ".read":true,
        ".write":"auth.uid === $UID",
        ".validate":"newData.hasChildren(['Name','Surname'])",
        "Name":{
        ".validate":"newData.val()!== null"
        },
        "Surname":{

        ".validate":"newData.val()!== null"
        },
        "$other":{
        ".validate": true
        }
      }

2 个答案:

答案 0 :(得分:0)

在我看来,问题在于您的google-services.json文件。

确保您的application nameclient idFirebase console中的相同。

如果您不确定,请从项目控制台重新下载google-services.json文件并将其添加到您的项目中。

也不要忘记将规则设置为:

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

请保留此规则仅用于测试目的。不要总是遵循这个规则。

希望它有所帮助。

答案 1 :(得分:0)

您跳过了MetaInfo课程的几个关键部分。但我会假设你有这些吸气剂:

public String getName() { return Name; }
public String getSurname() { return Surname; }

这些getter映射到(遵循古老的JavaBean约定)属性,名为namesurname。但您的规则会验证所有新数据都有NameSurname。起初可能很难发现,但外壳不同。

解决方案是根据您希望的方式存储属性:

@PropertyName("Name")
public String getName() { return Name; }
@PropertyName("Surname")
public String getSurname() { return Surname; }

如果你有相应的属性设置器,你还需要注释它们。

顺便解决这些问题的最简单方法是首先写入数据库中允许所有内容的位置。这样,您就可以看到Firebase SDK将您的POJO写入的内容,这样可以更轻松地发现它违反的验证规则。

另见: