【问题标题】:Android Room - Interface as EntityAndroid Room - 作为实体的界面
【发布时间】:2021-04-08 14:37:44
【问题描述】:

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

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 中显示的列表。

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

【问题讨论】:

  • 为什么要混合 DAO 和 UI 对象?你不应该这样做......使用一个实体并添加类型字段
  • 我该怎么办?我不太明白。

标签: android database android-recyclerview android-room adapter


【解决方案1】:

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

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

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

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

EventType map(DatabaseEntity entity) {

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

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

【讨论】:

  • 另外我必须知道... 什么类型的应用程序混合了青蛙、大象和牛排?!
  • 这些都是按照时间管理系统的事件类型)
猜你喜欢
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2017-12-12
  • 2019-01-22
相关资源
最近更新 更多