【问题标题】:What's the reason why I'm having "foreign key mismatch" error on Room?我在 Room 上出现“外键不匹配”错误的原因是什么?
【发布时间】:2020-05-25 07:13:32
【问题描述】:

我试图使用 Android 房间库提供的外键注释将我的“交易”表链接到我的“信封”表。基本上,我希望一个信封里面有多个交易。

我尝试过的事情:

  1. 我尝试将@Column_info(names) 添加到列中,但它没有做任何事情。

  2. 我还尝试检查我传递给 Transaction 构造函数的值是否确实引用了 Envelope 表上的 rowId,并且确实如此。

这些是我的表 POJO:

信封类:

@Entity(tableName = "envelope")
@Fts3
public class Envelope {
    @ColumnInfo(name="rowid")
    @PrimaryKey(autoGenerate = true)
    private int rowid;
    private String name;
    private float balance;
    private float maxBalance;
    private String description;
    private Date createdAt;
    private Date LastUpdatedAt;

事务类:

@Entity(foreignKeys = @ForeignKey(entity = Envelope.class,
        parentColumns = "rowid",
        childColumns = "envelopeId",
        onDelete = ForeignKey.CASCADE))
public class Transaction {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String name;
    private float amount;
    @ColumnInfo(name="envelopeId")
    private int envelopeId;
    private String type; //can be "income" or "expense"
    @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
    private Date dateTransacted;

这是错误:

SQLiteLog: (1) foreign key mismatch - "Transaction" referencing "envelope" in "INSERT OR ABORT INTO `Transaction` (`id`,`name`,`amount`,`envelopeId`,`type`,`dateTransacted`) VALUES (nullif(?, 0),?,?,?,?,?)"

【问题讨论】:

  • 除非知道可能不匹配的值,否则错误消息是无用的。
  • 我已经检查了我想在我的事务类的构造函数中添加的“envelopeId”值,看看它是否与我的信封类中的实际“rowId”值匹配,并且它确实存在。跨度>
  • 您找到解决方案了吗?在我将@Fts4 添加到我的一个实体并将列名更改为“rowid”后,我遇到了同样的问题。这些值似乎合适,但我得到了同样的错误......

标签: java android-sqlite android-room


【解决方案1】:

我认为问题可能在于您将“工作实体”注释为 FTS 索引实体,这使得主键不再可用作外键(此处的文档有点不清楚)。

您可以将 @Fts3 放在 Envelope 类上,并创建一个额外的 FTS 实体,使用 @Fts4(它可以让您指定内容实体)映射到您的原始实体。

@Fts4(contentEntity = Envelope.class)
@Entity(tableName = "envelopes_fts")
public class EnvelopeFts {
// The fields you want to index with getters and setters
}

至少在我将源实体和相应的 FTS 实体拆分为两个单独的 Room 实体后,我才能让我的外键再次工作。

【讨论】:

  • 谢谢。这让我对下一步应该做什么有了一个想法。
  • 有这方面的资料吗?这对我来说似乎是一个正当的理由,并且让我免于另外 3 个小时的调试......
  • 嗯,我不记得了,但我认为这是一种反复试验的方法,因为我没有在这里链接任何东西......很高兴它也对你有所帮助!
  • 我检查了语法:CREATE TABLE 有约束(因此可以用作外键),但 CREATE VIRTUAL TABLE 没有。明确提到 FTS 3, 45 都创建虚拟表,这就是原因。 docs about virtual table 没有明确指定不能创建约束。
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多