代码之家  ›  专栏  ›  技术社区  ›  Sharon

“在类中找不到字段的setter/字段”

  •  3
  • Sharon  · 技术社区  · 8 年前

    我正在Android Studio中创建一个应用程序,它连接到一个云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对象,并正确设置名称,但子类对象没有被设置——它仍然为null。

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

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

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   Alex Mamo    8 年前

    现在的问题是,类名必须与构造函数相同。你还需要添加一个 getter 给你的 subclass

    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将在字段中设置该值。但是如果你想从外部与班级互动,你应该添加它们。

    @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;
       }
    }
    
        2
  •  1
  •   halfer Jatin Pandey    8 年前

    模型类中有两个错误。第一个是构造函数的名称,它不同于类的名称,并且应该是相同的。第二个是关于 subclass 字段您只定义了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; }
    }
    

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

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

    关于在Cloud Firestore数据库中使用阵列的问题,请参阅我的回答 post