微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Android Room中为一对多关系创建recyclerview适配器

如何解决如何在Android Room中为一对多关系创建recyclerview适配器

大家好,我需要整个应用程序的真正帮助,这取决于我。我正在尝试在android房间数据库中的2个实体之间创建一对多关系。我想知道我该如何提取这两个实体的数据以显示狗的名字和主人的名字,以及如何实现recyclerview适配器。以下代码是我从开发人员文档中得出的。预先感谢

    @Entity(tableName = "table_dog")
public class Dogs {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "dog_id")
    private int dogId;

    @ColumnInfo(name = "dog_name")
    private String dogName;

    @ColumnInfo(name = "dog_owner_id")
    private int dogOwnerId;

    public Dogs(String dogName,int dogOwnerId) {
        this.dogName = dogName;
        this.dogOwnerId = dogOwnerId;
    }

    public int getDogId() {
        return dogId;
    }

    public void setDogId(int dogId) {
        this.dogId = dogId;
    }

    public String getDogName() {
        return dogName;
    }

    public void setDogName(String dogName) {
        this.dogName = dogName;
    }

    public int getDogOwnerId() {
        return dogOwnerId;
    }

    public void setDogOwnerId(int dogOwnerId) {
        this.dogOwnerId = dogOwnerId;
    }
}
@Entity(tableName = "table_dog")
public class Dogs {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "dog_id")
    private int dogId;

    @ColumnInfo(name = "dog_name")
    private String dogName;

    @ColumnInfo(name = "dog_owner_id")
    private int dogOwnerId;

    public Dogs(String dogName,int dogOwnerId) {
        this.dogName = dogName;
        this.dogOwnerId = dogOwnerId;
    }

    public int getDogId() {
        return dogId;
    }

    public void setDogId(int dogId) {
        this.dogId = dogId;
    }

    public String getDogName() {
        return dogName;
    }

    public void setDogName(String dogName) {
        this.dogName = dogName;
    }

    public int getDogOwnerId() {
        return dogOwnerId;
    }

    public void setDogOwnerId(int dogOwnerId) {
        this.dogOwnerId = dogOwnerId;
    }
}
public class DogOwner {
    @Embedded
    public Owner owner;

    @Relation(
            parentColumn = "owner_id",entityColumn = "dog_owner_id",entity = Dogs.class
    )
    LiveData<List<Dogs>> dogs;
}
@Dao
public interface DogOwnerDao {

    @Query("select * from table_owner")
    LiveData<List<DogOwner>> getAllDogs();

    @Insert
    void insert(DogOwner dogOwner);
}

解决方法

我认为您正在寻找类似于 INNER JOIN 的行为。

通过使用下面的类来获取数据,他们会收到一个主人的列表,而每个主人又都有一个狗的列表。

public class DogOwner {
    @Embedded
    public Owner owner;

    @Relation(
            parentColumn = "owner_id",entityColumn = "dog_owner_id",entity = Dogs.class
    )
    LiveData<List<Dogs>> dogs; //Shouldn't it just be list of dogs?
}

也就是说,您必须填充两个 RecyclerView,一个用于显示所有者列表,另一个用于实现特定所有者的列表。

要在单个列表中获取所有者和狗的数据,您需要实现类似于INNER JOIN的情况:

如果运行以下 SQL 语句,可以看到每只狗都包含其主人信息。

SELECT * FROM table_dog INNER JOIN table_owner ON table_dog.dog_owner_id = table_owner.owner_id

将其应用于您的班级将是:


public class DogOwner {
    @Embedded
    public Dogs dog;
    
    @Relation(
            entityColumn = "owner_id",parentColumn = "dog_owner_id",entity = Owner.class
    )
    public Owner owner;
}

道:

@Dao
public interface DogOwnerDao {
    
    @Transaction
    @Query("SELECT * FROM table_dog")
    LiveData<List<DogOwner>> getAllDogs();
}

这样你就已经拥有了每只狗的主人数据,你只需要实现一个 RecyclerView。

Kotlin 示例:

@Entity
data class Owner constructor(
    var name: String,var age: Int,var address: String,@PrimaryKey(autoGenerate = true) var id: Long = 0,)  
@Entity(
    foreignKeys = arrayOf(
        ForeignKey(
            entity = Owner::class,parentColumns = arrayOf("id"),childColumns = arrayOf("ownerId"),onDelete = ForeignKey.CASCADE,onUpdate = ForeignKey.CASCADE
        )
    )
)
data class Dog constructor(
    var name: String,val ownerId: Long,@PrimaryKey(autoGenerate = true) var id: Long = 0
)
data class DogWithOwner(
    @Embedded val dog: Dog,@Relation(
        entityColumn = "id",parentColumn = "ownerId",entity = Owner::class
    )
    val owner: Owner
)
@Dao
interface DogWithOwnerDao {
    @Transaction()
    @Query("SELECT * FROM Dog")
    suspend fun getAll(): List<DogWithOwner>

    @Transaction()
    @Query("SELECT * FROM Dog WHERE id=:id")
    suspend fun getById(id: Int): DogWithOwner
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。