【问题标题】:How can I fix a Foreign FOREIGN KEY constraint failed (code 787) error that doesn't have a Constraint?如何修复没有约束的外部 FOREIGN KEY 约束失败(代码 787)错误?
【发布时间】:2021-12-19 13:01:15
【问题描述】:

问题:我在尝试删除存储在 SQLite 数据库中的文件时收到 FOREIGN CONSTRAINT 错误(代码 787)。其他一切都适用于添加(即insert)文件,甚至读取(打开)它们。我只是无法删除它们。

我的尝试:我已经阅读了 4-5 篇文章,称这是一个已知问题。我认为一个帖子涉及一种冲突。类型冲突可能是一种可能性,除非我可以 insert 并阅读(打开)就好了。我认为这不是我的问题……也许吧,但我不确定。在走那么远之前,我想我会在这里发帖。我仍在学习有关 Android Room 和一般 Android 的知识,但可以借鉴比我学识渊博的人的一些见解。

发生错误的位置

rdb.getFilesDao().deleteFile(bFile);

Files.java(实体)

@Entity(tableName = "Files")
public class Files implements Parcelable {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "FileID")
    private int fileID;

    @ColumnInfo(name = "FileName")
    private String fileName;

    @TypeConverters(FileTypeConverter.class)
    @ColumnInfo(name = "FileData", typeAffinity = ColumnInfo.TEXT)
    private byte[] fileData;

    @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
    public Files(int fileID, String fileName, byte[] fileData){
        this.fileID = fileID;
        this.fileName = fileName;
        this.fileData = fileData;
    }

    public Files(Parcel in){
        this.fileID = in.readInt();
        this.fileName = in.readString();
        this.fileData = in.createByteArray();
    }

    public static final Creator<Files> CREATOR = new Creator<Files>() {
        @Override
        public Files createFromParcel(Parcel in) {
            return new Files(in);
        }

        @Override
        public Files[] newArray(int size) {
            return new Files[size];
        }
    };

FilesDao.java(道)

    @Dao
    public interface FilesDao {
        @Insert
        long addFile(Files file);
        @Update
        void updateFile(Files file);
        @Delete
        void deleteFile(Files file);
    
        @Query("SELECT * FROM Files")
        List<Files> getFiles();
        @Query("SELECT * FROM Files WHERE FileID = :fileID")
        Files getFile(int fileID);
    }

文件结构 (json)

    "tableName": "Files",
    "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`FileID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `FileName` TEXT, `FileData` TEXT)",
    "fields": [
      {
        "fieldPath": "fileID",
        "columnName": "FileID",
        "affinity": "INTEGER",
        "notNull": true
      },
      {
        "fieldPath": "fileName",
        "columnName": "FileName",
        "affinity": "TEXT",
        "notNull": false
      },
      {
        "fieldPath": "fileData",
        "columnName": "FileData",
        "affinity": "TEXT",
        "notNull": false
      }
    ],
    "primaryKey": {
      "columnNames": [
        "FileID"
      ],
      "autoGenerate": true
    },
    "indices": [],
    "foreignKeys": []
  },

更新添加图片以帮助评论/问题:

【问题讨论】:

  • 您是否从设备中提取了数据库进行检查?
  • hmmm,您向我们展示了文件信息,但还有其他东西,使用文件吗?那可能和它有关系?这就是为什么你不能删除它
  • @forpas - 是的,我已将模拟器中的副本保存到桌面并使用 SQLite Studio 对其进行检查。我将添加它的图像。
  • @svstackoverflow 也许我的问题不清楚。这些表中的任何一个(Author_by_source、Authors、Comments、Files_By_Note、Notes、Questions、Quotes、Sources、Terms、Topics)是否与(Files)有关系
  • @Susan Mustafa - 啊,是的,有一个 FilesByNote 关系,呵呵!我可以看到这会产生影响。我会看看是不是这个问题。

标签: java android sqlite foreign-keys


【解决方案1】:

在 Susan Mustafa 的帮助和 cmets 的帮助下,我在尝试删除文件时只是将连接表依赖项的代码顺序错误。一旦我颠倒了与文件有关的代码顺序,Foreign Key 错误就消失了。我应该已经抓住了这一点,但没有,应该先删除外键依赖项,然后再删除主项。

这些是相反的顺序:

rdb.getFilesByNoteDao().delete(new FilesByNote(id, oFile.getFileID()));
rdb.getFilesDao().deleteFile(oFile);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多