"No setter/field for field found on class"



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

Myclass
- name = "test"
- subclass
- 0 = "String 1"
- 1 = "String 2"

类本身是这样声明的(删除了不相关的位(:

public class Myclass {
private String name;
private String[] subclass;
// CONSTRUCTOR
public Chart() {}
//GETTERS
public String getName()     { return this.name; }
// SETTERS
public void setSubclass(String[] thisSubclass)    { this.subclass = thisSubclass; }
}

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

public class MyclassActivity  {
DocumentReference docRef;
Myclass myItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set up database connection, read in itemId etc...
// ...omitted for clarity...    
docRef = databaseRef.collection("myclass").document(itemId);
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
myItem = document.toObject(Myclass.class);
}
}
}
}

这在 Myclass 对象中读取,名称设置正确,但子类对象没有设置——它仍然是空的。

在调试控制台中,有以下消息:

No setter/field for subclass found on class path.to.app.Myclass

"setSubclass"函数显示为灰色,就好像它从未使用过一样。我确定问题是显而易见的,但我看不到它。

你现在的问题是你的类名必须与构造函数相同。此外,还需要向subclass参数添加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;
}
}

另一方面,您不需要添加二传手。它们不是必需的。Firebase 会将该值设置到字段中。但是,如果您要从外部与类进行交互,则应添加它们。

在某些情况下,您希望在参数上使用不同的名称,可能是因为您想遵循驼峰命名法或其他东西。如果是这种情况,您可以使用注释@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字段,您只定义了二传手,但没有吸气手。

您的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; }
}

不是不需要二传手。如果没有 JSON 属性的 setter,Firebase 客户端会将值直接设置到字段上,这就是称为惯用语的原因。如果在代码中显式需要它们,只需将以下资源库添加到模型类中,如下所示:

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

关于在Cloud Firestore数据库中使用数组,请参阅我在这篇文章中的回答。

最新更新