【问题标题】:How to fix "Entities and Pojos must have a usable public constructor" error?如何修复“实体和 Pojos 必须有可用的公共构造函数”错误?
【发布时间】:2019-09-14 10:27:39
【问题描述】:

我正在尝试在我的 Android 应用程序中设置 Room。我收到了这个错误,但我真的不明白为什么。

完全错误:实体和 Pojos 必须有一个可用的公共构造函数。你可以有一个空的构造函数或一个参数匹配字段(按名称和类型)的构造函数。

我使用的是 1.1.1 版的 Room。我尝试了空构造函数、带参数的构造函数,还修复了我遇到的所有警告,这样就没有其他问题了。

这是我的实体:

标记实体

@Entity(tableName = "markers")
public class Marker {
    public Marker(@Nullable String title, @Nullable String snippet, String latitude, String longitude, float color) {
        this.title = title;
        this.snippet = snippet;
        this.latitude = latitude;
        this.longitude = longitude;
        this.color = color;
    }

    @PrimaryKey(autoGenerate = true)
    private int id;
    private String title;
    private String snippet;
    private String latitude;
    private String longitude;
    private float color;

    /* Getters and setters */
}

照片实体

@Entity(tableName = "photos",
        foreignKeys = @ForeignKey(entity = Marker.class,
                                  parentColumns = "id",
                                  childColumns = "marker_id"),
        indices = {@Index("marker_id")})
public class Photo {
    public Photo(String imageBase64, int markerId) {
        this.imageBase64 = imageBase64;
        this.markerId = markerId;
    }

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "image")
    private String imageBase64;

    @ColumnInfo(name = "marker_id")
    private int markerId;

    /* Getters and setters */
}

网络实体

@Entity(tableName = "networks",
        foreignKeys = @ForeignKey(entity = Marker.class,
                                  parentColumns = "id",
                                  childColumns = "marker_id"),
        indices = {@Index("marker_id")})
public class Network {
    public Network(String ssid, String bssid, String capabilities, long timestamp, int markerId) {
        this.ssid = ssid;
        this.bssid = bssid;
        this.capabilities = capabilities;
        this.timestamp = timestamp;
        this.markerId = markerId;
    }

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String ssid;
    private String bssid;
    private String capabilities;
    private long timestamp;

    @ColumnInfo(name = "marker_id")
    private int markerId;

    /* Getters and setters */
}

这是我在 build.gradle 文件中对 Room 的依赖项:

def room_version = "1.1.1"

implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"

我看了很多这样的问题,没有一个能解决我的问题。

【问题讨论】:

  • 您在每个构造函数中都缺少一个参数,即 id。执行此操作的更好方法删除构造函数并为每个字段创建get(),set() ..
  • @ADM 我尝试使用 id 参数,但仍然出现此错误。我也有每个字段的getter和setter,我只是觉得放它们太多了,所以我只是在上面的代码中写了一个注释。
  • 参数化构造函数省略了默认构造函数。所以要么你定义一个默认构造函数,要么删除这个参数化构造函数..
  • @ADM 我尝试添加一个空的默认构造函数并在我的参数化构造函数中为每个实体添加 @Ignore 注释,但仍然有相同的错误。我也尝试过删除参数化构造函数。

标签: java android android-room


【解决方案1】:

错误是由于 MarkerDao 类中的错误,而不是实体本身(不知何故)。

更准确地说,一个函数试图从 SELECT string, string from ... 查询中获取 LatLng 对象:

@Query("SELECT latitude, longitude FROM markers WHERE id = :id")
LatLng getMarkerLatitude(int id);

这个错误调试起来非常烦人,因为它没有提供任何细节。如果有人发现了这一点,请注释掉您的实体和 DAO,并一次取消注释它们,以查看错误开始发生的位置。

祝你好运!

来源:我与@Jean-Christophe Martel 合作

【讨论】:

    【解决方案2】:

    像这样创建空的构造函数。

    public Marker(){};
    
    public Photo(){};
    
    public Network(){};
    

    或者你可以删除所有的构造函数。清理项目并重建。检查这是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-03
      • 2017-11-20
      • 2019-05-21
      • 1970-01-01
      • 2020-08-12
      • 2017-11-13
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多