Сложный объект невозможно получить из базы данных Room: регистрация InstanceCreator или TypeAdapter.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Сложный объект невозможно получить из базы данных Room: регистрация InstanceCreator или TypeAdapter.

Сообщение Anonymous »

Я использую базу данных Room и хочу хранить сложный объект из сторонней библиотеки.
У меня есть:

Код: Выделить всё

@Entity(tableName = "messages")
@TypeConverters(
ChatMessageContentConverter::class
)
data class MessageEntity(
@PrimaryKey(autoGenerate = false)
val id: String,
val threadId: String,
val content: ChatMessageContent? = null,
val senderDisplayName: String? = null
)
Теперь... ChatMessageContent — это объект библиотеки SDK, поэтому я использую конвертер:

Код: Выделить всё

class ChatMessageContentConverter {

private val gson = Gson()

@TypeConverter
fun toChatMessageContent(value: String?): ChatMessageContent? {
return value?.let { gson.fromJson(value, ChatMessageContent::class.java) }
}

@TypeConverter
fun fromChatMessageContent(content: ChatMessageContent?): String? {
return content?.let { gson.toJson(content) }
}
}
На этом этапе все в порядке, потому что когда я сохраняю объект в базе данных, он работает. Однако, когда я хочу получить все объекты из этой базы данных, я получаю только 2-3 объекта и вижу ошибку:

Код: Выделить всё

error: java.lang.RuntimeException: Unable to create instance of class com.azure.android.communication.common.CommunicationIdentifier. Registering an InstanceCreator or a TypeAdapter for this type, or adding a no-args constructor may fix this problem.
Я копнул глубже и обнаружил, что CommunicationIdentifier на самом деле принадлежит объекту ChatMessageContent.

Код: Выделить всё

public final class ChatMessageContent {
@JsonProperty("message")
private String message;
@JsonProperty("topic")
private String topic;
@JsonProperty("participants")
private List participants;
@JsonProperty("initiatorCommunicationIdentifier")
private CommunicationIdentifier initiatorCommunicationIdentifier;

public ChatMessageContent() {
}

public String getMessage() {
return this.message;
}

public ChatMessageContent setMessage(String message) {
this.message = message;
return this;
}

public String getTopic() {
return this.topic;
}

public ChatMessageContent setTopic(String topic) {
this.topic = topic;
return this;
}

public List getParticipants() {
return this.participants;
}

public ChatMessageContent setParticipants(List participants) {
this.participants = participants;
return this;
}

public CommunicationIdentifier getInitiatorCommunicationIdentifier() {
return this.initiatorCommunicationIdentifier;
}

public ChatMessageContent setInitiatorCommunicationIdentifier(CommunicationIdentifier initiatorCommunicationIdentifier) {
this.initiatorCommunicationIdentifier = initiatorCommunicationIdentifier;
return this;
}
}
Тот же объект CommunicationIdentifier находится внутри объекта ChatParticipant, поэтому мне нужно написать конвертер для CommunicationIdentifier, чтобы избежать ошибки.
Не знаю, как это сделать правильно, потому что при использовании следующего кода я все равно получаю ту же ошибку:

Код: Выделить всё

class CommunicationIdentifierConverter {

private val gson = Gson()

@TypeConverter
fun toCommunicationIdentifier(value: String?): CommunicationIdentifier? {
return value?.let { gson.fromJson(it, CommunicationIdentifier::class.java) }
}

@TypeConverter
fun fromCommunicationIdentifier(identifier: CommunicationIdentifier?): String? {
return identifier?.let { gson.toJson(identifier) }
}
}
и добавьте:

Код: Выделить всё

@TypeConverters(
ChatMessageContentConverter::class,
CommunicationIdentifierConverter::class
)
и это все равно вызывает ту же ошибку

Подробнее здесь: https://stackoverflow.com/questions/784 ... instancecr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»