Невозможно использовать одну и ту же модель для ROOM и Retrofit - PullRequest
0 голосов
/ 21 мая 2019

Я делаю вызов API, ответ включает в себя список объектов, ответ json:

[
{
    "name": "jay",
    "age": 27,
    "avatar": "https://avatars.abc/bat_man/",
    "friends": [{
            "friend_name": "abc",
            "friend_age": 23,
            "avatar": "https://avatars.abc/thor/"
        },
        {
            "friend_name": "xyz",
            "friend_age": 26,
            "avatar": "https://avatars.abc/hulk/"
        },
        {
            "friend_name": "pqr",
            "friend_age": 28,
            "avatar": "https://avatars.abc/iron_man/"
        }
    ]
},

{
    "name": "ajay",
    "age": 27,
    "avatar": "https://avatars.abc/bat_man/",
    "friends": [{
            "friend_name": "abc",
            "friend_age": 23,
            "avatar": "https://avatars.abc/thor/"
        },
        {
            "friend_name": "xyz",
            "friend_age": 26,
            "avatar": "https://avatars.abc/hulk/"
        },
        {
            "friend_name": "pqr",
            "friend_age": 28,
            "avatar": "https://avatars.abc/iron_man/"
        }
     ]
  }

]

Я создал модель без свойства friends, как только я добавил Список Friend, я не смог использовать комнату, Теперь созданная мной модель будет работать для RetroFit, но она не будет работать для Room , поскольку Room не поддерживает List Objects внутри объекта.

Я исправил это с помощью @TypeConverter, но после этого модернизация перестала работать. Я ищу подход, чтобы я мог использовать одну и ту же модель для обоих (вызов API + сохранение данных через комнату).

Я пытался заставить модель работать с ROOM, но после этого мой обратный вызов api дооснащения приближается к onFailure() по очевидной причине, что он не анализируется, я получаю ошибку Failed sending reply to debugger: Broken pipe.

Есть ли какой-либо способ, поэтому я игнорирую какое-то конкретное свойство в вызове Retrofit и использую одну и ту же модель для обеих целей.

Моя модель выглядит:

@Entity(tableName = "user_table")
public class User {
    private String name;
    private String href;
    private String avatar;
    private Friends friend;

public User(String name, String href, String avatar, Friends friend) {
    this.name = name;
    this.href = href;
    this.avatar = avatar;
    this.friend = friend;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getHref() {
    return href;
}

public void setHref(String href) {
    this.href = href;
}

public String getAvatar() {
    return avatar;
}

public void setAvatar(String avatar) {
    this.avatar = avatar;
}

public Friends getFriend() {
    return friend;
}

public void setFriend(Friends friend) {
    this.friend = friend;
}
}

1 Ответ

0 голосов
/ 21 мая 2019

Вы можете использовать свой первый подход, пометив @Ignore полями, которые вы хотите игнорировать в комнате

@Entity(tableName = "user_table")
public class User {
    private String name;
    private String href;
    private String avatar;
    @Ignore private Friends friend;

Предполагая, что в вашем Дао есть что-то вроде этого

@ Dao

public interface MyDao {

    @Insert
    public void insertUser(User user);

    @Insert
    public void insertFriends(List<Friend> friends);
}

Затем вы можете добавить свои данные следующим образом

myDao.insertUser(user)
myDao.insertFriends(user.getFriend())

Используя этот подход, вам придется внести некоторые изменения:

  • Вместо этогодля объекта Friends класс User должен иметь объект List из Friend.
  • Необходимо создать таблицу Friends с соответствующими внешними ключами (это включает добавление поля userId к объекту friends)
...