【问题标题】:How to use Room with Java to manage foreign keys如何使用 Room 和 Java 来管理外键
【发布时间】:2021-02-25 22:10:16
【问题描述】:

对于 Room 和新的 Jetpack 应用架构来说绝对是全新的。

我有一个包含两个规范化表的数据库:项目和类别。我为两者创建了单独的类:Item (PK = "rowid") 引用 Category (PK = "catid") 中的主键。

我的 SQLite 语句是:

创建表“项目”( “RowId”整数非空, “CatId”整数非空, “项目名称”文本不为空, FOREIGN KEY("CatId") REFERENCES "CATEGORIES"("CategoryId") ON UPDATE CASCADE ON DELETE CASCADE, 主键(“RowId”自动增量) );

如何使用 Room 在 Item 中定义外键语句?我试过了:

@Entity(foreignKeys = @ForeignKey(entity = Item.class, parentColumns = "rowid", childColumns="catid"))

并得到错误:@entity not applicable to field。

只需寻找正确的语句语法和其他适用的东西(导入、变量等)。

谢谢。

【问题讨论】:

标签: android foreign-keys android-room


【解决方案1】:

试试这个,这应该可以解决问题

@Entity(tableName = "Categories")
internal class Categories {
    @PrimaryKey
    @ColumnInfo(name = "CategoryId")
    var categoryId = 0
}

@Entity(
    tableName = "Items",
    foreignKeys = [ForeignKey(
        entity = Categories::class,
        parentColumns = ["CategoryId"],
        childColumns = ["CatID"],
        onDelete = ForeignKey.CASCADE,
        onUpdate = ForeignKey.CASCADE
    )]
)
internal class Items {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "RowId")
    var rowid = 0

    @ColumnInfo(name = "CatID")
    var catId = 0
}

这是room生成的SQL语句

CREATE TABLE IF NOT EXISTS `Items` (`RowId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `CatID` INTEGER NOT NULL, FOREIGN KEY(`CatID`) REFERENCES `Categories`(`CategoryId`) ON UPDATE CASCADE ON DELETE CASCADE )

我确实注意到您的问题中存在一些不一致之处,但您可以使用上面的代码并将您想要用作外键列的内容转移

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多