我在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/