3 votes

Mise en correspondance avec les modèles de chambre

J'ai une question qui sera peut-être facile pour certains d'entre vous mais que je n'arrive vraiment pas à résoudre.

J'ai un json formaté comme ceci :

{
    "id" : "1641S818",
    "balance" : "100.20",
    "transactions" : [
        {
            "id" : "item1",
            "price" : "1.50",
            "description" : "pen",
            "date" : "2018-05-14T14:19:00Z"
        },
        {
            "id" : "item1",
            "price" : "9.00",
            "description" : "book",
            "date" : "2018-05-14T08:19:00Z"
        }
    ]
}

Je voulais essayer de mettre en place une application avec Retrofit + Room pour la première fois, et j'ai du mal à construire des modèles.

J'ai créé ces classes de données pour Retrofit et elles fonctionnent bien. Ce n'est pas une surprise car je sais comment l'utiliser.

data class Account (
    val id : String,
    val balance : Double,
    val transactions : List<Transaction>
)

data class Transaction (
    val id : String,
    val price : Double,
    val description : String,
    val date : String
)

Les vrais problèmes commencent lorsque je veux sauvegarder cette structure dans une base de données, avec cette relation un à plusieurs existant entre le compte et la transaction. Jusqu'à présent, j'ai compris que Room ne pouvait pas gérer ce type de structure et que je devais créer des classes différentes pour le modèle de base de données. C'est ce que j'ai fait :

@Entity(tableName = "account")
data class AccountData(

    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = false)
    val id: String,

    val balance: Double,

)

@Entity(
    tableName = "transaction",
    foreignKeys = [
        ForeignKey(
            entity = AccountData::class,
            parentColumns = ["id"],
            childColumns = ["account_id"],
            onUpdate = ForeignKey.CASCADE,
            onDelete = ForeignKey.CASCADE
        )
    ]
)
data class TransactionData(

    @PrimaryKey(autoGenerate = false)
    @ColumnInfo(name = "id")
    val transactionId: String,

    @ColumnInfo(name = "account_id")
    val accountId: String,

    val price: Double,

    val description: String,

    val date: String

)

Maintenant, la partie où je suis coincé. Je n'arrive pas à trouver un guide, un exemple, quoi que ce soit qui montre où convertir les modèles avec un mappeur (peut-être en utilisant livedata ou rx) dans ce cas particulier, c'est-à-dire lorsque nous avons des relations complexes entre les objets et pas seulement des classes ordinaires.

1voto

Ufkoku Points 1363

Vous pouvez définir un fichier Mapper séparé avec des fonctions d'extension comme ceci

fun Transaction.toTransactionData() = TransactionData(...)

Et ensuite, après l'appel de l'API, probablement dans le UseCase, vous pouvez utiliser cette fonction pour faire correspondre votre entité API à l'entité DB et ensuite passer le résultat à Room dao.

UPD 1. En outre, vous pouvez définir Transation pour l'utilisation de l'interface utilisateur. Ainsi, au niveau du UseCase, vous opérez avec RestTransaction y DbTransaction mais en passant Transaction à l'UI, à l'abstraction de sa source.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X