![](/img/trans.png)
[英]FOREIGN KEY constraint failed (code 787) [NO ANDROID ROOM]
[英]Android room foreign key constraint failed 787. Folder system
如何在Room中實現數據庫的文件夾系統? 我想創建文件夾並在其中存儲一些數據。 不需要嵌套文件夾。
在將表與數據(webSites)和文件夾表一起使用之前,然后創建第三個表WebSitesWithFolders,在其中存儲webSites_id和folder_id。 但是,當我更新或刪除用戶表中的字段時,它們都正常工作,但是如果我從“文件夾”中刪除字段,那么我會得到錯誤外鍵約束失敗(代碼787)。
網站實體
@Entity
public class WebSites {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo()
private String website_head;
@ColumnInfo()
private String website_url;
@ColumnInfo()
private String img_src;
public WebSites(@NonNull String website_head, String website_url, String img_src) {
this.website_head = website_head;
this.website_url = website_url;
this.img_src = img_src;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWebsite_head() {
return website_head;
}
public void setWebsite_head(String website_head) {
this.website_head = website_head;
}
public String getWebsite_url() {
return website_url;
}
public void setWebsite_url(String website_url) {
this.website_url= website_url;
}
public String getImg_src() {
return img_src;
}
public void setImg_src(String img_src) {
this.img_src = img_src;
}
}
文件夾實體
@Entity
public class Folders {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo()
private String name;
public Folders(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
WebSitesWithFolders
@Entity(tableName = "websites_with_folders",
foreignKeys = {
@ForeignKey(entity = WebSites.class,
parentColumns = "id",
childColumns = "webSitesId",
onDelete = CASCADE,
onUpdate = CASCADE),
@ForeignKey(entity = Folders.class,
parentColumns = "id",
childColumns = "foldersId",
onDelete = CASCADE,
onUpdate = CASCADE)
})
public class WebSitesWithFolders {
@PrimaryKey(autoGenerate = true)
private int idd;
@ColumnInfo()
private int webSitesId;
@ColumnInfo()
private int foldersId;
public WebSitesWithFolders(int webSitesId, int foldersId) {
this.webSitesId = webSitesId;
this.foldersId = foldersId;
}
public int getWebSitesId() {
return webSitesId;
}
public void setWebSitesId(int webSitesId) {
this.webSitesId = webSitesId;
}
public int getFoldersId() {
return foldersId;
}
public void setFoldersId(int foldersId) {
this.foldersId = foldersId;
}
public int getIdd() {
return idd;
}
public void setIdd(int idd) {
this.idd = idd;
}
}
以我的經驗,當您在關系中聲明的某些ID丟失時,您會在Room中獲得787外鍵約束失敗。 我的錯誤是,我試圖在第三個表中添加一個對象(用於多對多關系),然后再將該對象添加到一個父表中。
最后,請確保在刪除時您不會保持不一致的狀態(websites_with_folders表的ID在網站或文件夾表中不再存在)。 在delete上具有層疊屬性應該可以幫助您,但是我會通過測試再次檢查發生了什么。 另外,我建議不要對website_with_folders使用“ id”主鍵,而應使用由webSitesId和folderId組成的多個主鍵,如下所示:
@Entity(tableName = "websites_with_folders",
primaryKeys ={webSitesId ,foldersId}
希望這能解決您的問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.