簡體   English   中英

Android房間外鍵約束失敗787。文件夾系統

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM