Как сохранить в Room список обьектов?

203
17 сентября 2018, 00:50

Для примера, есть у меня класс Human() который как один из параметров содержит список Car()

class Human() {
...//
public List<Car>
...//
}

Как сохранить такой обьект?

Я так пронимаю, есть 2 варианта

1)либо из каждого обьекта списка делать стринг используя @TypeConverter

2)либо как то использовать one-to-many

Answer 1

Я скину вам кусок кода, который использую у себя. Думаю вы сможете разобраться

class Account {
@Embedded
lateinit var user: User
@Relation(parentColumn = "email", entity = PurseUser::class, entityColumn = "emailId")
lateinit var userPursers: List<PurseUser>
@Relation(parentColumn = "email", entity = TransitionUser::class, entityColumn = "emailId")
lateinit var userTransitions: List<TransitionUser>

}

Модель PurseUser

@Entity(foreignKeys = arrayOf(ForeignKey(entity = User::class, parentColumns = arrayOf("email"), childColumns = arrayOf("emailId"), onDelete = ForeignKey.CASCADE)), primaryKeys = arrayOf("emailId", "walletAddress"))
class PurseUser {
    var scoring: Double = 0.toDouble()
    lateinit var emailId: String
    lateinit var walletAddress: String
    @TypeConverters(PurseConverter::class)
    lateinit var typePurseEnum: TypePurse
    constructor(scoring: Double, emailId: String, walletAddress: String, typePurseEnum: TypePurse) {
        this.scoring = scoring
        this.emailId = emailId
        this.walletAddress = walletAddress
        this.typePurseEnum = typePurseEnum
    }
    constructor() {
    }
    fun setTypePurse(typePurse: TypePurse) {
        this.typePurseEnum = typePurse
    }
}

И метод добавления

@Insert
abstract fun insertPurseUser(purseUsers: List<PurseUser>)
@Transaction
open fun insertAccount(account: Account) {
    insert2(account.user)
    insertPurseUser(account.userPursers)
    insertTransitionUser(account.userTransitions)
}
@Transaction
open fun updatePurse(purseUser: PurseUser, purseUser2: PurseUser) {
    updatePurseUser(purseUser)
    updatePurseUser(purseUser2)
}

Так же по мне очень удобно можно получать данные пользователя одним запросом.

@Transaction
@Query("SELECT * FROM User WHERE email = :emailId")
abstract fun getAccount(emailId: String): Maybe<Account>

Где метод в моем репозитории

  override fun getAccount(email: String): Maybe<Account> {
        return MaybeUtils<Account>().getMaybe(database.accountDao().getAccount(email))
    }

Этот метод находится у меня в презентере

override fun setAdapterTransition() {
    repository.getAccount(userState.email).subscribe(object : DisposableMaybeAbstract<Account>(context, context.getString(R.string.emailError), context.getString(R.string.emailError)) {
        override fun onSuccess(user: Account) {
            account = user
            mainScreenView.setAdapterTransition(ModelsView.setAdapterTransition(account))
            mainScreenView.setAdapterPurse(ModelsView.setAdapterPurses(account))
            mainScreenView.setAdapterPurseTransition(ModelsView.setAdapterPurseTransition(account.userPursers))
            mainScreenView.setAdapterTransitionSheet(ModelsView.setAdapterTransitionSheet(context.resources.getStringArray(R.array.sheetTransitions)))
        }
    })
}

И мой базовый

abstract class DisposableMaybeAbstract<T>(private val context: Context, private val onComplete: String, private val onError: String) : DisposableMaybeObserver<T>() {
    override fun onSuccess(t: T) {
        MessageUtils.showCustomMessage(context, onError, context.resources.getColor(R.color.colorRed))
    }
    override fun onError(e: Throwable) {
        MessageUtils.showCustomMessage(context, onError, context.resources.getColor(R.color.colorRed))
    }
    override fun onComplete() {
        MessageUtils.showCustomMessage(context, onComplete, context.resources.getColor(R.color.colorRed))
    }
}
Answer 2

Пока, что ответ 2 из этого поста мне нравится больше всего

Может я чего то не вижу, если так пишите в коммнеты

Но мне кажется он самым удобным, так как ты сам сохраняешь как тебе нужно без создания доп обьектов и без в последующем внезапных сюрпризов

https://stackoverflow.com/questions/44667160/android-room-insert-relation-entities-using-room

  1. Just Create a User with Pets (Ignore pets).

    @Entity
    public class User {
          @PrimaryKey
          public int id; 
          @Ignore
          private List<Pet> petList;
    }
  2. Create Pet.

    @Entity 
    public class Pet 
    {
        @PrimaryKey
        public int id;     
        public int userId; 
        public String name;
    }
  3. Now Finally in UserDao.

    @Insert
    public abstract void insertUser(User user);
    @Insert
    public abstract void insertPetList(List<Pet> pets);
    @Query("SELECT * FROM User WHERE id =:id")
    public abstract User getUser(int id);
    @Query("SELECT * FROM Pet WHERE userId =:userId")
    public abstract List<Pet> getPetList(int userId);
    public void insertUserWithPet(User user) {
        List<Pet> pets = user.getPetList();
        for (int i = 0; i < pets.size(); i++) {
            pets.get(i).setUserId(user.getId());
        }
        insertPetList(pets);
        insertUser(user);
    }
    public User getUserWithPets(int id) {
        User user = getUser(id);
        List<Pet> pets = getPetList(id);
        user.setPetList(pets);
        return user;
    }

Your Problem can be solved by this without creating UserWithPets POJO.

READ ALSO
Java объявление классов

Java объявление классов

Можно ли в java объявить класс прямо в методе?

166
Java работа с массивом

Java работа с массивом

если массив {true, true, true} result = true; если массив {true, false, true} result = false;

163
Где найти примеры использования кодека H264 Cisco для андроид

Где найти примеры использования кодека H264 Cisco для андроид

Мне нужно декодировать видеопоток H264, но стандартный MediaCodec не справляетсяНужен пример использования H264 Cisco в андроиде

193
Не работает визульное представление xml разметки в Android Studio

Не работает визульное представление xml разметки в Android Studio

Всем приветСтолкнулся с проблемой, из-за которой я уже 3 раза переустанавливал Студию

186