android - 是否可以在 Room 中创建没有主键的表?

标签 android android-room

我在MySql中有一个表,我将其命名为FAQs,表内有两列,问题列答案栏,我想获取FAQs表中的数据并将其存储在离线数据库中,但我收到此消息An实体必须至少有1个带注释的字段与@PrimaryKey

表格

@Entity(tableName = "FAQs")
public class FAQModel {
    
    private String question, answer;

    public String getQuestion() {
        return question;
    }

    public String getAnswer() {
        return answer;
    }

}

是否可以在没有主键的情况下在 Room 中创建表?

最佳答案

是的,您可以,但有一些困难,但不能通过房间注释,即使它仍然有一个主键,所以答案实际上是否定的。

  • 可以(例如通过回调)创建一个似乎没有主键列的表,例如如果不存在 the_table,则创建表(问题文本,回答文本)但是,
    • 它在rowid列上有一个主键,该列通常是隐藏的。
    • 这样的表不容易使用,因为您必须避免 Room 的编译时 SQL 语句检查。
    • 您也无法直接利用 Room 的基础表进行对象处理。

但是,你发表了评论

But in the android app I only get the question and answer column and I am not getting faqId because I don't want to use it inside my app.

因此,您可以有一个排除 faqId 列的 POJO 类,例如

class FAQModelLessIdColumn {
    String question,answer;
}

假设 FAQModel 是实体,因此是表名,那么使用上面的内容,您可以有一个 @Query,例如:-

@Query("SELECT * FROM faqmodel")
abstract List<FAQModelLessIdColumn> getFAQModelsLessTheFaqIdColumn();

但是,随着时间的推移,您可能会了解到主键列非常有用,因为它必须唯一标识表中的单行。因此,您可以从单个值高效地执行 CRUD 操作。

  • 打个比方,将表格视为一个列表,其中的问题没有按特定顺序写下。要找到问题及其答案闰年有多少天,那么您必须搜索整个列表,直到找到问题。然而,如果根据问题的第一个字符将列表分成多个列表,并且按顺序维护这些列表,那么跳到 H 列表可能会更容易找到问题。因此索引可以大大减少搜索时间。因此,拥有可用的 faqId 可以通过主索引进行搜索,并且速度会更快。

关于android - 是否可以在 Room 中创建没有主键的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70667976/

相关文章:

java - 我的警报对话框自定义布局出现问题

android - 只需少量更改即可为同一类的不同版本构建 flavor

android - Android 应用程序可以由第三方扩展吗?

android - Room Dao 返回插入 ID,但数据库中缺少数据

java - 具有一对一关系外键约束的房间数据库失败错误

android - 释放时房间会受到挤压

android - 在表面 View 中打开的android相机的最佳相机参数是什么

android - 如何使用 Mockito 模拟 SharedPreferences

android - Room 和 rxjava 数据库不工作?

java - 用房间数据库填充微调器