【发布时间】: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