当前位置: 首页 > 知识库问答 >
问题:

Android房间-作为实体的界面

柴茂材
2023-03-14

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

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

    int getType();

    void onBindViewHolder(RecyclerView.ViewHolder viewHolder);
}

我还有三个数据类--青蛙、大象和牛排。我在屏幕上显示所有这些对象的数组。

@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("Стейк");
    }
}

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

如何将此列表保存到数据库?或者我必须从接口创建一个单独的表吗?

共有1个答案

弓玉书
2023-03-14

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

因此您的实体应该是这样的:

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

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

EventType map(DatabaseEntity entity) {

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

这显然只是伪代码,您应该以一种对您来说最有意义的方式来实现它。但是,通常不应该将数据库模型与表示层中的模型混合使用。即使拥有一个模型更简单,但它通常会引起更多的头痛,如您的示例所示。

 类似资料:
  • 我在房间使用关系中添加了一对多关系。我引用这篇文章是为了编写以下房间关系代码。 这篇文章讲述了如何从数据库中读取值,但将实体存储到数据库中会导致用户ID为空,这意味着这两个表之间没有关系。 我不确定在具有用户ID值的情况下,将用户和宠物列表插入数据库的理想方法是什么。 1)用户实体: 2) 宠物实体: 3)用户带宠物POJO: 现在,为了从DB中获取记录,我们使用以下DAO: 编辑 我已创建此问题

  • 我开始使用Room数据库并通过几个文档来创建房间实体。这些是我的关系。聊天频道可以有很多对话。所以这是一对多的关系。因此我创建了如下实体。 渠道实体 会话实体 现在,您可以看到,对话属于一个频道。当用户看到频道列表时,我需要在列表项中显示上次对话的几个属性。我的问题是,如果我只是像上面那样声明关系,或者应该在通道类中包含会话对象,这就足够了吗?我还有什么其他方法可以处理它?因为当用户滚动时,UI需

  • 我想实现Android房间持久性。这是我的DAO接口。 出于某种原因,我有以下编译错误: 错误:可观察的查询返回类型(LiveData、Flowable、DataSource、DataSourceFactory等)只能与直接或间接(例如通过@关系)访问至少一个表的SELECT查询一起使用。对于@RawQuery,您应该通过observedEntities字段指定要观察的表的列表。公开摘要andro

  • 错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:任务) 显示了这个错误,我怎么可能修复它? 我正在学习这个教程

  • 我知道我不能在查询中使用删除(顺便说一句,这很遗憾),我会得到以下错误: 但是我不能使用Delete(其中…xxx)那么如何通过参数删除特定行?

  • 在Room中添加新创建的对象时,自动生成主键,新创建的对象将保留其未定义的主键。当您需要修改此对象并保留更改时,这证明是不方便的。 让我们举个例子。 因此,让我们创建一个,其是自动生成的。 我们有以下Dao: 我们通过以下存储库进行交互: 所以,现在如果我们这样做,将不会被更新,因为将保持在0并且注释仅在主键已经存在的情况下更新行。 为了解决这个问题,我们可以将的方法更改为在插入后更新id。这个问