【问题标题】:Ambiguous getter for Field... Room persistence libraryField 的模糊吸气剂......房间持久性库
【发布时间】:2026-01-19 07:05:02
【问题描述】:

我有以下实体

public class User {
    @PrimaryKey
    private final long id;

    private String _id;
    private String userName;
    private String email;
}

但是,当我尝试使用房间持久性库在 android 中为该实体创建表时,出现以下错误。

Error:(18, 20) error: Ambiguous getter for Field(element=_id, name=_id, type=java.lang.String, affinity=TEXT, columnName=_id, parent=null, indexed=false). All of the following match: getId, get_id. You can @Ignore the ones that you don't want to match.

包含_id 字段,这样我就可以直接翻译来自连接到mongodb 数据库的node.jsapi 的响应。

【问题讨论】:

  • 如果你的类列表是完整的,那么我怀疑 Room 不喜欢具有相同基本名称的字段,不同之处仅在于 _ 前缀。你能在 JSON 方面做点什么吗,比如 @SerializedName 和 Gson,允许字段有不同的名称(例如,mongodb_id)?另外,您的课程列表是否完整,或者是否有您当前列表未显示的 getter 方法?
  • 你的意思是当我得到 API 的响应时?它会自动将所有_id字段序列化为mongodb_id吗?
  • 是的,我在问这是否可能。我不知道您的 Web 服务客户端 API 使用的是什么。一些在 Android 上工作的 JSON 解析器,例如 Gson,支持 @SerializedName 之类的注解,因此 JSON 中的名称可以与 Java 字段名称不同。
  • 使用@SerialName("_id") String "yourval" ;这肯定会帮助你。

标签: android android-room


【解决方案1】:

您需要为每个私有字段设置 setter 和 getter,否则您应该将它们公开,可能导致此错误的另一个原因是一个字段有两个 getter 或 setter。

【讨论】:

    【解决方案2】:

    房间:

    就我而言

    public String getpBSalesTotal() {
        return pBSalesTotal;
    }
    
    public void setpBSalesTotal(String pBSalesTotal) {
        this.pBSalesTotal = pBSalesTotal;
    }
    

    是我想要在我的数据库中作为表的上一个 POJO 类。

    我刚刚将小写的“p”改为大写的“P”,这解决了我的问题 错误

    。如下所示

    public String getPBSalesTotal() {
        return pBSalesTotal;
    }
    
    public void setPBSalesTotal(String pBSalesTotal) {
        this.pBSalesTotal = pBSalesTotal;
    }
    

    生成这种类型的

    POJO 格式 JSON

    你可以使用这个LINK。它适用于 Room。

    【讨论】:

      【解决方案3】:

      根据文档,您需要为每个字段声明 getter。

      我可以看到您没有使用 @Entity 注释声明您的类。 还要确保您使用的是最新版本的库,因为它仍在开发中,您需要进行一些突破性的更改。

      请参见下面的示例,使用以下 api 版本的 Room 对我来说效果很好。

      api 'android.arch.persistence.room:runtime:1.0.0-alpha8'
      

      或者您也可以使用“alpha9”。 希望这能解决您的问题。

      @Entity (tableName = "user")
      public class User {
      
      @PrimaryKey
      private int id;
      
      private String _id;
      
      @ColumnInfo(name = "user_name")
      private String userName;
      
      @NonNull
      private String passwrod;
      
      public User(String userName, @NonNull String passwrod) {
          this.userName = userName;
          this.passwrod = passwrod;
      }
      
      @Ignore
      public User() {
      }
      
      public int getId() {
          return id;
      }
      
      public void setId(int id) {
          this.id = id;
      }
      
      public String getUserName() {
          return userName;
      }
      
      public void setUserName(String userName) {
          this.userName = userName;
      }
      
      public String getPasswrod() {
          return passwrod;
      }
      
      public void setPasswrod(String passwrod) {
          this.passwrod = passwrod;
      }
      
      public String get_id() {
          return _id;
      }
      
      public void set_id(String _id) {
          this._id = _id;
      }
      

      }

      【讨论】:

        【解决方案4】:

        getter 的返回类型应该与属性数据类型相同,如果你有 int 数据类型的属性,当我发现它解决了我的问题。

        祝你好运。

        【讨论】:

          【解决方案5】:

          我也面临同样的问题。当我删除

          “_”下划线符号,来自“_id”

          然后工作正常。

          public class User {
              @PrimaryKey
              private final long id;
          
              private String myid;
              private String userName;
              private String email;
          }
          

          它适用于我,我希望它适用于其他人。谢谢。

          【讨论】:

            【解决方案6】:

            如果再次发生这种情况,我强烈建议您在 Android Studio 的帮助下自动生成 getter 和/或 setter。

            这样你就不会再冒险在这个问题上花费时间了。

            要了解如何操作,请查看SO-answer

            【讨论】: