Android Room - 作为实体的接口

问题描述

我有一个包含对象类型的接口。它也用于 ViewType。

public interface EventType {
    int TYPE_FROG = 1;
    int TYPE_STEAK = 2;
    int TYPE_ELEPHANT = 3;

    int getType();

    void onBindViewHolder(RecyclerView.ViewHolder viewHolder);
}

而且我还有三类数据 - Frog、Elephant 和 Steak。 我在屏幕上显示所有这些对象的数组。

@Entity
public class Frog implements EventType {

    @PrimaryKey(autoGenerate = true)
    int id;

    String title;

    Boolean isCompleted;

    @Override
    public int getType() {
        return EventType.TYPE_FROG;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder) {
        ViewHolderFactory.FrogViewHolder frogViewHolder = (ViewHolderFactory.FrogViewHolder) viewHolder;
        frogViewHolder.tv.setText("Жаба");
    }
}

@Entity
public class Elephant extends Frog implements EventType{

    @PrimaryKey(autoGenerate = true)
    int id;

    String title;

    Boolean isCompleted;

    @Override
    public int getType() {
        return EventType.TYPE_ELEPHANT;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder) {
        ViewHolderFactory.ElephantViewHolder elephantViewHolder = (ViewHolderFactory.ElephantViewHolder) viewHolder;
        elephantViewHolder.tv.setText("Слон");
    }
}

@Entity
public class Steak extends Frog implements EventType{

    @PrimaryKey(autoGenerate = true)
    int id;

    String title;

    Boolean isCompleted;


    @Override
    public int getType() {
        return EventType.TYPE_STEAK;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder) {
        ViewHolderFactory.SteakViewHolder steakViewHolder = (ViewHolderFactory.SteakViewHolder) viewHolder;
        steakViewHolder.tv.setText("Стейк");
    }
}

在我的片段中,我创建了所有三种类型的对象列表,即 List. 使用适配器在 RecyclerView 中显示的列表。

如何将这个列表保存到数据库中?还是我必须从界面中创建一个单独的表?

解决方法

你应该有一个 Entity(所以一张表)来存储它们。然后,您可以将 type 作为字段,并使用它将从数据库返回的对象映射到表示层的正确类型。

所以你的实体应该是这样的:

DatabaseEntity(int id,int type,String title,boolean isCompleted)

然后您将根据其类型将其映射到正确的对象,因此:

EventType map(DatabaseEntity entity) {

    if(entity.type == TYPE_FROG) {
        
        return new Frog(...);
    }
}

这显然只是伪代码,您应该以对您最有意义的方式实现它。但是,您通常不应将数据库模型与表示层中的模型混合在一起。尽管拥有一个模型更简单,但它通常会导致更多的麻烦,如您的示例所示。