Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;在“类”上找不到字段的setter/字段;_Java_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Java &引用;在“类”上找不到字段的setter/字段;

Java &引用;在“类”上找不到字段的setter/字段;,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我正在Android Studio中创建一个应用程序,它连接到云Firestore数据库。在数据库中,我具有以下结构: Myclass - name = "test" - subclass - 0 = "String 1" - 1 = "String 2" 类本身是这样声明的(删除了不相关的位): 在活动中,Myclass对象的设置如下(同样,删除了不相关的位): “setSubclass”函数显示为灰色,好像从未使用过一样。我确信问题很明显,但我看不出来。模型类中

我正在Android Studio中创建一个应用程序,它连接到云Firestore数据库。在数据库中,我具有以下结构:

Myclass
  - name = "test"
  - subclass
     - 0 = "String 1"
     - 1 = "String 2"
类本身是这样声明的(删除了不相关的位):

在活动中,Myclass对象的设置如下(同样,删除了不相关的位):


“setSubclass”函数显示为灰色,好像从未使用过一样。我确信问题很明显,但我看不出来。

模型类中有两个错误。第一个是构造函数的名称,它与类的名称不同,并且应该相同。第二,对于
子类
字段,您只定义了setter,而没有定义getter

您的
Myclass
类应如下所示:

public class MyClass {
    private String name;
    private String[] subclass;

    public MyClass() {}

    public MyClass(String name, String[] subclass) {
        this.name = name;
        this.subclass = subclass;
    }

    public String getName() { return name; }

    public String[] getSubclass() { return subclass; }
}
public void setName(String name) { this.name = name; }

public void setSubclass(String[] subclass) { this.subclass = subclass; }
不需要设置器。如果JSON属性没有setter,Firebase客户端将直接将值设置到字段上,这就是为什么称为惯用。如果在代码中显式地需要它们,只需向模型类添加以下setter,如下所示:

public class MyClass {
    private String name;
    private String[] subclass;

    public MyClass() {}

    public MyClass(String name, String[] subclass) {
        this.name = name;
        this.subclass = subclass;
    }

    public String getName() { return name; }

    public String[] getSubclass() { return subclass; }
}
public void setName(String name) { this.name = name; }

public void setSubclass(String[] subclass) { this.subclass = subclass; }

关于在Cloud Firestore数据库中使用数组的问题,请参见我的回答,您现在的问题是您的类名必须与构造函数相同。您还需要向
子类
参数添加一个
getter

public class Chart {

   private String name;
   private String[] subclass;

   public Chart() {
   //Default empty constructor, required for Firebase.
   }

   public Chart(String name, String[] subclass) {
       this.name = name;
       this.subclass = subclass;
   }

   public String getName() {
      return this.name;
   }

   public String[] getSubclass() {
      return subclass;
   }
}
另一方面,您不需要添加setter。它们不是必需的。Firebase将在字段中设置该值。但是,如果要从外部与类交互,则应该添加它们

在某些情况下,您希望在参数上有不同的名称,可能是因为您希望遵循camelCase命名法或其他什么。如果是这种情况,您可以使用注释
@PropertyName
在数据库中提供不同的名称,并根据需要保留模型。例如:

public class Chart {

   @PropertyName("name")
   private String mName;
   @PropertyName("subclass")
   private String[] mSubclass;

   public Chart() {
   }

   @PropertyName("name")
   public String getmName() {
      return mName;
   }

   @PropertyName("subclass")
   public String[] getmSubclass() {
      return mSubclass;
   }
}

为什么不尝试将子类字段设置为列表而不是数组<代码>私有列表子类尝试过-没有任何区别。除非我应该对数据库中的数据结构做些什么?这是一个键值对吗subclass-0=“String 1”-1=“String 2”谢谢!我把它改成了一个列表(所以是List而不是String[]),并添加了一个Getter,它成功了。谢谢你的帮助!
public class Chart {

   @PropertyName("name")
   private String mName;
   @PropertyName("subclass")
   private String[] mSubclass;

   public Chart() {
   }

   @PropertyName("name")
   public String getmName() {
      return mName;
   }

   @PropertyName("subclass")
   public String[] getmSubclass() {
      return mSubclass;
   }
}