"Не найден установщик / поле для поля в классе" - PullRequest
0 голосов
/ 05 июня 2018

Я создаю приложение в 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' неактивна, как будто она никогда не используется.Я уверен, что проблема очевидна, но я не вижу этого.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Ваша проблема сейчас в том, что имя вашего класса должно совпадать с именем конструктора.Также вам нужно добавить 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;
   }
}

С другой стороны, вам не нужно добавлять сеттеры.Они не обязательны.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;
   }
}
0 голосов
/ 06 июня 2018

У вас есть две ошибки в вашем классе модели.Первым будет имя конструктора, которое отличается от имени класса и должно быть таким же.И второе, для поля 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 нет установщика, клиент Firebase установит значение непосредственно в поле, поэтому он называется idiomatic.Если они вам нужны явно в вашем коде, просто добавьте следующие сеттеры в класс вашей модели следующим образом:

public void setName(String name) { this.name = name; }

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

Что касается использования массивов в базе данных Cloud Firestore, см. Мой ответ из этого сообщение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...