Java 什么';这就是我为什么';我有;外键不匹配“;房间出错?

Java 什么';这就是我为什么';我有;外键不匹配“;房间出错?,java,android-sqlite,android-room,Java,Android Sqlite,Android Room,我试图使用Android room库提供的外键注释将我的“事务”表链接到我的“信封”表。基本上,我希望一个信封中包含多个事务 我尝试过的事情: 我已经尝试将@Column\u info(names)添加到列中,但没有任何效果 我还尝试检查我传递给事务构造函数的值是否确实引用了信封表上的rowId,它确实引用了 这是我的桌子POJO: 信封类别: 交易类别: 以下是错误: 我认为问题可能在于您将“工作实体”注释为FTS索引实体,这使得主键不再可用作外键(此处的文档有点不清楚) 您可以在信封类中

我试图使用Android room库提供的外键注释将我的“事务”表链接到我的“信封”表。基本上,我希望一个信封中包含多个事务

我尝试过的事情:
  • 我已经尝试将
    @Column\u info(names)
    添加到列中,但没有任何效果

  • 我还尝试检查我传递给事务构造函数的值是否确实引用了信封表上的rowId,它确实引用了

  • 这是我的桌子POJO:

    信封类别: 交易类别: 以下是错误:
    我认为问题可能在于您将“工作实体”注释为FTS索引实体,这使得主键不再可用作外键(此处的文档有点不清楚)

    您可以在信封类中删除
    @Fts3
    ,并创建一个额外的FTS实体,该实体使用
    @Fts4
    (允许您指定内容实体)映射到原始实体


    至少在我将源实体和对应的FTS实体拆分为两个单独的房间实体后,我才能使外键重新工作。

    除非知道可能不匹配的值,否则错误消息是无用的。我已检查了“信封ID”我想在事务类的构造函数中添加的值,以查看它是否与信封类中的实际“rowId”值匹配,并且它确实存在。找到解决方案了吗?在我将@Fts4添加到我的一个实体并将列名更改为“rowid”后,我遇到了同样的问题。这些值似乎合适,但我得到了相同的错误…谢谢。这让我对下一步该做什么有了一个想法。有消息来源吗?这对我来说似乎是一个合理的理由,并使我避免了另外3个小时的调试…嗯,我真的不记得了,但我认为这是一种尝试和错误的方法,因为我没有在这里链接任何东西。。。很高兴它也帮助了你!我检查了语法:has constraint(因此可以用作外键),但没有。明确提到FTS和all创建虚拟表,这就是原因。about虚拟表没有明确指定不能创建任何约束。
    @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),?,?,?,?,?)"
    
    
    @Fts4(contentEntity = Envelope.class)
    @Entity(tableName = "envelopes_fts")
    public class EnvelopeFts {
    // The fields you want to index with getters and setters
    }