Я пытаюсь настроить Room в моем приложении для Android. Я получаю эту ошибку, но я действительно не понимаю, почему.
Полная ошибка: у сущностей и Pojos должен быть общедоступный конструктор. Вы можете иметь пустой конструктор или конструктор, параметры которого соответствуют полям (по имени и типу).
Я использую версию 1.1.1 комнаты. Я пробовал пустые конструкторы, конструкторы с параметрами, а также исправил все предупреждения, которые у меня были, чтобы больше ничего не могло быть проблемой.
Вот мои сущности:
Маркер Сущность
@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
@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 */
}
А вот мои зависимости для Room в моем файле build.gradle:
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
Я посмотрел на многие подобные вопросы, и ни один из них не решил мою проблему.
Ошибка произошла из-за ошибки в классе MarkerDao
а не в самой сущности (каким-либо образом).
Точнее, функция пыталась получить объект LatLng
из SELECT string, string from...
запроса:
@Query("SELECT latitude, longitude FROM markers WHERE id = :id")
LatLng getMarkerLatitude(int id);
Эта ошибка была очень неприятной для отладки, поскольку она не дает подробностей. Если кто-то обнаружит это, закомментируйте ваши сущности и DAO и покомментируйте их по одному, чтобы увидеть, где начинает происходить ошибка.
Удачи!
Источник: я работаю с @Жан-Кристоф Мартел
Создайте пустые конструкторы, как это.
public Marker(){};
public Photo(){};
public Network(){};
или вы можете удалить все конструкторы. Очистить проект и восстановить. Проверьте, работает ли это.