Android Room库错误:找不到字段的获取方法

时间:2018-07-06 21:59:32

标签: java android

我收到此错误,但找不到任何解决方案。我尝试了很多事情,但仍然得到了这段代码。

我的代码是: https://justpaste.it/4di3y

错误:

  

错误:找不到字段的getter。   (私人Long fie_id)

我该如何解决? 谢谢。

14 个答案:

答案 0 :(得分:4)

代替

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

答案 1 :(得分:2)

即使生成getter setter之后,我也面临着奇怪的问题。但是我通过this solution

解决了

答案 2 :(得分:2)

也许您不相信我,但我不得不说。我正在使用Mac,该问题与计算机语言有关。我当时使用的是土耳其语,后来我改成了英语,但是在无效缓存和重新启动之后,这个问题就消失了。

摘要:

  • 将MacOSX语言设置为英语(系统偏好设置->语言和区域)
  • 打开Android Studio并执行使缓存无效并重新启动(文件->使缓存无效/重新启动->无效并重新启动)

答案 3 :(得分:1)

这与您的PrimaryKey的命名有关。 getter和setter的签名应与变量名称相对应。否则,Room找不到它。

这意味着变量id应该具有getId(),变量fie_id应该具有getFie_id()作为获取器,设置方法也是如此。因此,请重命名您的PrimaryKey或相应地命名您的获取器和设置器。

答案 4 :(得分:1)

对我来说是因为没有大写的“ m”。下面的作品:

@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")
        }
    }

答案 5 :(得分:1)

将所有访问修饰符更改为“ public”。这样可以解决问题。

代替:

@PrimaryKey
private Long fie_id;

@ColumnInfo(name = "name")

private String name;

使用:

@PrimaryKey
public Long fie_id;

@ColumnInfo(name = "name")

public String name;

答案 6 :(得分:0)

在程序生命周期中,如果封装不正确,则会引起混乱。查看您的代码后,似乎正在尝试访问一个永恒类。正在调用PrimaryKey id而不是传递的值setId(id)。

答案 7 :(得分:0)

最好坚持使用文件。结构很敏感。 link of documantation  样本:

@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;
}}

在更改之后,项目选项ClearRebuild遇到了相同的问题。

答案 8 :(得分:0)

对于setter中的getter,就像示例中一样,遵循字段的Pattern get / set [A-Z] last lenght-1(字段:mWord)

@Entity(tableName = "words")

公共类单词{

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

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

public String getMWord() {
    return mWord;
}

}

答案 9 :(得分:0)

仅需要更改的是,将域合并范围更新为“公共”而不是“私有”。

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

答案 10 :(得分:0)

尝试将setter函数的名称与声明的变量名匹配。 外汇交易。 有一个声明为

的布尔变量 私有布尔附件状态; <​​/ strong>

吸气剂应该是这样的

公共布尔值getattachment_status(){
  返回attachment_status
}

或者您可以这样做

公共布尔型getAttachment_status(){
返回attachment_status
}

我这样声明我的吸气剂,但遇到了相同的错误

公共布尔型getAttachment(){
  返回attachment_status
}

但是我重构了,问题解决了。

答案 11 :(得分:0)

将变量从私有更改为受保护对我来说很有效。

答案 12 :(得分:0)

如果一切正确,那么我在大多数情况下都会观察到此问题,例如pId,uId等。

更改变量名称
  

私人长 pId ;

  

私人长 pid ;

并使用IDE生成getter和setter。

答案 13 :(得分:0)

科特林室不允许在'i'字符的实体类开头定义变量。我有同样的错误。我解决了,尽管很困难。 将id替换为pId,就可以了。 例如;

  val isrc: String? = "",

代替

  val albumIsrc: String? = "",

如果以此方式更改变量,则错误将得到解决。 祝你幸福。