Java &引用;在“类”上找不到字段的setter/字段;
我正在Android Studio中创建一个应用程序,它连接到云Firestore数据库。在数据库中,我具有以下结构: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”函数显示为灰色,好像从未使用过一样。我确信问题很明显,但我看不出来。模型类中
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;
}
}