Ошибка библиотеки Android Room: не удается найти получатель для поля

Я получаю эту ошибку, но не могу найти решения. Я много чего пробовал, но все равно получаю этот код.

Мой код:https://justpaste.it/4di3y

Ошибка:

error: Cannot find getter for field. ( private Long fie_id )

Как я могу это исправить?

Разместите код здесь, а не на внешнем сайте.

craigcaulfield 07.07.2018 03:28

Я проголосовал против того, что не опубликовал код.

Keith Loughnane 15.01.2019 16:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
2
14 872
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Если в течение жизненного цикла вашей программы значение инкапсуляция неверно, возникает путаница. После просмотра вашего кода кажется, что вы пытаетесь получить доступ к чему-то из вечного класса. PrimaryKey id вызывается вместо переданного значения setId (id).

Ответ принят как подходящий

Вместо

public Long getId() {
    return fie_id;
}

public void setId(Long id) {
    this.fie_id = id;
}

Делать

public Long getFie_id() {
    return fie_id;
}

public void setFie_id(Long fie_id) {
    this.fie_id = fie_id;
}

Я изменил частное на общедоступное, и у меня это работает. Спасибо.

user8143839 07.07.2018 00:57

@Cellojaan Переменные должны быть закрытыми, а конструкторы общедоступными, это принцип инкапсуляции.

Suleyman 07.07.2018 10:19

для пояснения, PrimaryKey id, setId (Long id) this.fie_id = id. он вызывал PrimaryKey id?

EvOlaNdLuPiZ 07.07.2018 17:12

извините, я изменил общедоступный на частный :) до того, как идентификатор стал общедоступным, когда я меняю частный, он работает для меня

user8143839 07.07.2018 21:15

Я не знаю, является ли это ошибкой, но в обычных обстоятельствах поля класса должны быть закрытыми и назначать сеттер / получатель для доступа к ним по причинам инкапсуляции. Но Room требует, чтобы они всегда были публичными.

The_Martian 21.02.2019 23:02

Я думаю, что это не для частного / публичного, как указано выше. В моем случае имя columnInfo и переменная-член должны совпадать. Например, @ColumnInfo (name = "word") и частное строковое слово; и метод получения, например - public String getWord ();

Saiful Islam Sajib 06.09.2019 21:14

Это связано с наименованием вашего PrimaryKey. Подпись вашего геттера и сеттера должна соответствовать имени переменной. В противном случае Room не сможет его найти.

Это означает, что переменная id должна иметь getId(), а переменная fie_id должна иметь getFie_id() в качестве получателя, то же самое касается сеттеров. Итак, либо переименуйте свой PrimaryKey, либо назовите свои геттеры и сеттеры соответственно.

Лучше придерживаться документации. Структуры чувствительны. ссылка на документацию Образец :

@Entity(tableName = "notes")
public class Note {

@PrimaryKey(autoGenerate = true)
public int id;   

@NotNull
@ColumnInfo(name = "note")
public  String mNote;

public Note(@NotNull String mNote) {
    this.mNote = mNote;
}

public int getId() {
    return id;
}

@NotNull
public String getNote() {
    return this.mNote;
}}

Если бы такая же проблема была у Clear и Rebuild, варианты проекта - это как-то после изменения.

для геттера в сеттере просто следуйте шаблону get / set [A-Z] last lenght-1 поля, как в примере (field: mWord)

@Entity(tableName = "words")

public class Word {

@PrimaryKey
@NonNull
@ColumnInfo(name = "word")
private String mWord;

public Word(@NonNull String mWord) {
    this.mWord = mWord;
}

public String getMWord() {
    return mWord;
}

}

Единственное, что нужно изменить, это указать обновление области как «общедоступное», а не «частное».

https://github.com/rzwitserloot/lombok/issues/1403

Для меня это было из-за не заглавной буквы «м». Ниже работает:

@ColumnInfo(name = "foo")
private String mFoo;

public String getMFoo() {
    return mFoo;
}

public void setMFoo(String foo) {
    this.mFoo = foo;
}

Это не так:

@ColumnInfo(name = "foo")
private String mFoo;

public String getmFoo() {
    return mFoo;
}

public void setmFoo(String foo) {
    this.mFoo = foo;
}

Также не забудьте указать новый столбец в вашей миграции. Что-то вроде:

val MIGRATION_2_3: Migration = object : Migration(2, 3) {
        override fun migrate(database: SupportSQLiteDatabase) {
            database.execSQL("ALTER TABLE myDataObj "
                    + " ADD COLUMN foo TEXT")
        }
    }

Измените все модификаторы доступа на "public". Это решит проблему.

Вместо:

@PrimaryKey
private Long fie_id;

@ColumnInfo(name = "name")

private String name;

Использовать:

@PrimaryKey
public Long fie_id;

@ColumnInfo(name = "name")

public String name;

Попытайтесь сопоставить имя функции установки с объявленным именем переменной. Форекс. Существует логическая переменная, объявленная как

частное логическое значение attachment_status;

Получатель должен быть таким

public boolean getattachment_status () {
вернуть статус_приложения
}

или вы можете сделать вот так

public boolean getAttachment_status () {
вернуть статус_приложения
}

Я объявил свой получатель таким образом, и у меня была такая же ошибка

public boolean getAttachment () {
вернуть статус_приложения
}

но я реорганизовал его, и проблема была решена.

Для меня сработало изменение переменной с частной на защищенную.

Если все верно, то я наблюдал эту проблему в основном в случае переменных типа pId, uId и т. д.

изменить имя переменной с

private Long pId;

к

private Long pid;

И сгенерируйте геттер и сеттер с помощью IDE.

Может ты мне не веришь, но я должен сказать. Я использую Mac, и эта проблема была связана с компьютерным языком. Я использовал турецкий язык, и я перешел на английский, и эта проблема исчезла после недействительного кеширования и перезапуска.

В качестве резюме:

  • Установите язык MacOSX как английский (Системные настройки -> Язык и регион)
  • Откройте Android Studio и выполните Аннулирование кешей и перезапуск (File -> Invalidate Caches / Restart -> Invalidate and Restart)

Изначально азербайджанский язык был выбран в качестве предпочтительного языка, по этой причине я столкнулся с той же проблемой

Seyid-Kanan Bagirov 09.02.2021 14:41

Комната Kotlin не позволяет определять переменные в начале класса сущности с символа «i». У меня была такая же ошибка. Решил, хоть и непросто. Замени id на pId, и все будет хорошо. Например;

  val isrc: String? = "",

вместо

  val albumIsrc: String? = "",

Если вы измените переменную таким образом, ошибка будет устранена. Удачного кодирования.

Примечание :, если системный язык ваших компьютеров - турецкий, то в этом случае.

Другие вопросы по теме