ошибка: сущности и Pojos должны иметь открытый конструктор - Java - PullRequest
0 голосов
/ 05 октября 2018

Всякий раз, когда я пытаюсь скомпилировать приложение, я получаю эту ошибку

error: Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List

SystemMessagesEntity.java:

    @Entity(tableName = "system_messages")
    @TypeConverters(ReplyMessages.class)
    public class SystemMessageEntity {
        @PrimaryKey
        @NonNull
        public String messageId;
        public String title;
        public String body;
        public String color;
        public Integer date;
        public String icon;
        public String ad;
        public Integer isRead;
        public String ip;
        String id; //user_id
        @Embedded(prefix = "reply_")
        private List<ReplyMessage> reply_message;

        @Ignore
        public SystemMessageEntity() {
        }

        public SystemMessageEntity(String id, @NonNull String messageId, String title, String body, String color, Integer date, String icon, String ad, Integer isRead, String ip, List<ReplyMessage> reply_message) {
            this.id = id;
            this.messageId = messageId;
            this.title = title;
            this.body = body;
            this.color = color;
            this.date = date;
            this.icon = icon;
            this.ad = ad;
            this.isRead = isRead;
            this.ip = ip;
            this.reply_message = reply_message;
        }
    //getters and setters
}

ReplyMessages.java:

@TypeConverters(ReplyMessages.class)

publicКласс ReplyMessage {

private String body = "";
private String userId = "";
private Integer date = 0;
private String id = "";
private String messageId = "";


@Ignore
public ReplyMessage() {
}

public ReplyMessage(String body, String userId, Integer date, String id, String messageId) {
    this.body = body;
    this.date = date;
    this.id = id;
    this.messageId = messageId;
    this.userId = userId;
}

И это TypeConverter:

public class ReplyMessages {

@TypeConverter
public static String ListToJson(List<ReplyMessage> replyMessages) {
    if(replyMessages == null) return null;
    Type type = new TypeToken<List<ReplyMessage>>() {}.getType();
    String json = new Gson().toJson(replyMessages, type);
    Log.i("JSON", "toJson: " + json);
    return replyMessages.isEmpty() ? null : json;
}

@TypeConverter
public static List<ReplyMessage> JsonToList(String json) {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ReplyMessage>>() {}.getType();
    List<ReplyMessage> replyMessages = gson.fromJson(json, type);
    return replyMessages;
}

}

Я хочу получить данные json из API с помощью Retrofit и сохранить их вбаза данных. Данные json содержат массив объектов (MessageReply) внутри родительского массива объектов (SystemMessagesEntity).

Я пробовал все и искал почти все вопросы в StackOverFlow, но ничего не нашел.

Редактировать : Когда я использовал только объект SystemMessageEntity, база данных работала нормально.Но когда я добавил сущность ReplyMessage, появилась проблема.

Редактировать 2: Проблема была решена путем удаления List <> из ReplyMessage.Я не знаю, почему список не работает, хотя я использую конвертер.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Я решил проблему.Ну, кажется, что я не могу использовать @Embedded с @TypeConverter главным образом потому, что конвертер возвращает String, а его примитив не класс POJO.В любом случае, я удалил аннотацию @Embedded, и она работала нормально.

0 голосов
/ 05 октября 2018

В Android Room требуется пустой конструктор, поэтому удалите аннотацию @Ignore из пустого конструктора и поместите ее в конструктор с параметрами.

 public SystemMessageEntity() {}

 @Ignore
 public SystemMessageEntity(String id, @NonNull String messageId, ...) {
     // ... initializing the params
 }
...