如何修复没有约束的 Foreign FOREIGN KEY constraint failed (code 787) 错误?
How can I fix a Foreign FOREIGN KEY constraint failed (code 787) error that doesn't have a Constraint?
问题: 当我尝试删除存储在 SQLite 数据库中的文件时,我收到了 FOREIGN CONSTRAINT 错误(代码 787)。其他一切都适用于添加(即 insert
)文件甚至读取(打开)它们。我只是无法删除它们。
我尝试过的方法:我读过 4-5 post 篇,称其为已知问题。我认为 post 涉及一种冲突。类型冲突可能是一种可能性,除非我可以 insert
和阅读(打开)就好了。我认为这不是我的问题……也许吧,但我不确定。在走那么远之前,我想我会在这里post。我仍在了解 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": []
},
已更新 添加图片以辅助 comment/questions:
在 Susan Mustafa 的帮助和评论下,我只是在尝试删除文件时以错误的代码顺序加入了 table 依赖项。一旦我颠倒了与文件有关的代码的顺序,Foreign Key
错误就消失了。我应该抓住这个但没有,在删除主要之前应该先删除外键依赖项。
顺序相反:
rdb.getFilesByNoteDao().delete(new FilesByNote(id, oFile.getFileID()));
rdb.getFilesDao().deleteFile(oFile);
问题: 当我尝试删除存储在 SQLite 数据库中的文件时,我收到了 FOREIGN CONSTRAINT 错误(代码 787)。其他一切都适用于添加(即 insert
)文件甚至读取(打开)它们。我只是无法删除它们。
我尝试过的方法:我读过 4-5 post 篇,称其为已知问题。我认为 post 涉及一种冲突。类型冲突可能是一种可能性,除非我可以 insert
和阅读(打开)就好了。我认为这不是我的问题……也许吧,但我不确定。在走那么远之前,我想我会在这里post。我仍在了解 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": []
},
已更新 添加图片以辅助 comment/questions:
在 Susan Mustafa 的帮助和评论下,我只是在尝试删除文件时以错误的代码顺序加入了 table 依赖项。一旦我颠倒了与文件有关的代码的顺序,Foreign Key
错误就消失了。我应该抓住这个但没有,在删除主要之前应该先删除外键依赖项。
顺序相反:
rdb.getFilesByNoteDao().delete(new FilesByNote(id, oFile.getFileID()));
rdb.getFilesDao().deleteFile(oFile);