Android:为什么如果我只删除子项,Room会删除父项?

huangapple go评论52阅读模式
英文:

Android: why Room removes parent if I remove only child?

问题

I'm working with Room for an android application.

@Entity(tableName = "author")
data class AuthorEntity(
@PrimaryKey
@ColumnInfo(name = "authorId")
val authorId: String,
@ColumnInfo(name = "name")
val name: String?

@Entity(tableName = "book")
data class BookEntity(
@PrimaryKey
@ColumnInfo(name = "bookId")
val bookId: String,
@ColumnInfo(name = "title")
val title: String?

@Entity(
tableName = "author_book",
primaryKeys = ["authorId", "bookId"],
foreignKeys = [
ForeignKey(
entity = AuthorEntity::class,
parentColumns = arrayOf("authorId"),
childColumns = arrayOf("authorId"),
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE
),
ForeignKey(
entity = BookEntity::class,
parentColumns = arrayOf("bookId"),
childColumns = arrayOf("bookId"),
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE
)
]
)
data class AuthorBookCrossRef(
val authorId: String,
val bookId: String,
val desc: String
)

data class NewsWithSectionWithContract(
@Embedded val authorEntity: AuthorEntity,
@Relation(
parentColumn = "authorId",
entityColumn = "bookId",
associateBy = Junction(
AuthorBookCrossRef::class
)
)
var bookEntities: List
)

If I remove BookEntity it should remove only AuthorBookCrossRef row, so why does it also remove AuthorEntity?

英文:

I'm working with Room for an android application.

@Entity(tableName = "author")
data class AuthorEntity(
@PrimaryKey
@ColumnInfo(name = "authorId")
val authorId: String,
@ColumnInfo(name = "name")
val name: String?

@Entity(tableName = "book")
data class BookEntity(
@PrimaryKey
@ColumnInfo(name = "bookId")
val bookId: String,
@ColumnInfo(name = "title")
val title: String?

@Entity(
    tableName = "author_book",
    primaryKeys = ["authorId", "bookId"],
    foreignKeys = [
        ForeignKey(
            entity = AuthorEntity::class,
            parentColumns = arrayOf("authorId"),
            childColumns = arrayOf("authorId"),
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
        ),
        ForeignKey(
            entity = BookEntity::class,
            parentColumns = arrayOf("bookId"),
            childColumns = arrayOf("bookId"),
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
        )
    ]
)
data class AuthorBookCrossRef(
    val authorId: String,
    val bookId: String,
    val desc: String
)

data class NewsWithSectionWithContract(
    @Embedded val authorEntity: AuthorEntity,
    @Relation(
        parentColumn = "authorId",
        entityColumn = "bookId",
        associateBy = Junction(
            AuthorBookCrossRef::class
        )
    )
    var bookEntities: List<BookEntity>
)

If I remove BookEntity it should remove only AuthorBookCrossRef row, so why does it also remove AuthorEntity?

答案1

得分: 1

It appears that deleting the book with ID "b004" did not remove the author Lewis Carrol, but it did remove the book "Alice through the Looking Glass." After further deleting the book with ID "b003," Lewis Carrol still exists as an author with 0 books.

英文:

I believe that you are mistaken or not checking the actual data.

Using the code you have provided and additionally:-

@Dao
interface AllDAOs{
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(authorEntity: AuthorEntity): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(bookEntity: BookEntity): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(authorBookCrossRef: AuthorBookCrossRef): Long

    @Delete
    fun delete(authorBookCrossRef: AuthorBookCrossRef): Int
    @Delete
    fun delete(bookEntity: BookEntity): Int
    @Delete
    fun delete(authorEntity: AuthorEntity): Int

    @Query("SELECT * FROM author")
    fun getAllAuthors(): List<AuthorEntity>
    @Query("SELECT * FROM book")
    fun getAllBooks(): List<BookEntity>
    @Query("SELECT* FROM author_book")
    fun getAllAuthorBookRefs(): List<AuthorBookCrossRef>
    @Transaction
    @Query("SELECT * FROM author")
    fun getAllAuthorsWithBooks(): List<NewsWithSectionWithContract>
}

@Database(entities = [AuthorEntity::class,BookEntity::class,AuthorBookCrossRef::class], version = 1, exportSchema = false)
abstract class TheDatabase: RoomDatabase() {
    abstract fun getAllDAOs(): AllDAOs

    companion object {
        var instance: TheDatabase?=null
        fun getInstance(context: Context): TheDatabase {
            if (instance==null) {
                instance = Room.databaseBuilder(context,TheDatabase::class.java,"the_database.db")
                    .allowMainThreadQueries()
                    .build()
            }
            return instance as TheDatabase
        }
    }
}

And then in an activity:-

class MainActivity : AppCompatActivity() {
    lateinit var db: TheDatabase
    lateinit var dao: AllDAOs
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        db = TheDatabase.getInstance(this)
        dao = db.getAllDAOs()

        dao.insert(AuthorEntity("LC001","Lewis Carrol"))
        dao.insert(AuthorEntity("JS001","John Steinbeck"))
        dao.insert(AuthorEntity("WS001","William Shakespeare"))
        dao.insert(AuthorEntity("CD001","Charles Dickens"))

        dao.insert(BookEntity("b001","David Copperfield"))
        dao.insert(BookEntity("b002","Oliver"))
        dao.insert(BookEntity("b003","Alice in Wonderland"))
        dao.insert(BookEntity("b004","Alice through the Looking Glass"))
        dao.insert(BookEntity("b005","The Lion, the Witch and the Wardrobe"))
        dao.insert(BookEntity("b006","Wrath of the grapes"))
        dao.insert(BookEntity("b007","Day of the Triffids"))
        dao.insert(BookEntity("b008","Something"))

        dao.insert(AuthorBookCrossRef("LC001","b003","AIW"))
        dao.insert(AuthorBookCrossRef("LC001","b004","ATTLG"))
        dao.insert(AuthorBookCrossRef("JS001","b007","DOTT"))
        dao.insert(AuthorBookCrossRef("JS001","b006","WOTG"))
        dao.insert(AuthorBookCrossRef("CD001","b001","DC"))
        dao.insert(AuthorBookCrossRef("CD001","b002","O"))

        logAllData("_STAGE1")

        dao.delete(BookEntity("b004","does not matter!!!!"))

        logAllData("_STAGE2")

    }

    fun logAllData(tagSuffix: String) {
        val tag = "DBINFO_"
        Log.d(tag + tagSuffix,"ALL Authors")
        for (a in dao.getAllAuthors()) {
            Log.d(tag + tagSuffix,"\tAuthor is ${a.name} ID is ${a.authorId}")
        }
        Log.d(tag + tagSuffix,"ALL Books")
        for (b in dao.getAllBooks()) {
            Log.d(tag + tagSuffix,"\tBook is ${b.title} ID is ${b.bookId}")
        }
        Log.d(tag + tagSuffix,"All Author Book Refs")
        for (ab in dao.getAllAuthorBookRefs()) {
            Log.d(tag + tagSuffix,"\t AID is ${ab.authorId} BID is ${ab.bookId} DESC is ${ab.desc}")
        }
        Log.d(tag + tagSuffix,"Authors with Books")
        for (awb in dao.getAllAuthorsWithBooks()) {
            val sb=StringBuilder()
            for (b in awb.bookEntities) {
                sb.append("\n\t\tBook is ${b.title} BID is ${b.bookId}")
            }
            Log.d(tag + tagSuffix,"Author is ${awb.authorEntity.name}. Has ${awb.bookEntities.size} Books. They are:$sb" )
        }
    }
}

Then it can be seen that deleting the book with an id of "b004" does not remove the author.

That is prior to the deletion the output from the log is:-

2023-05-18 06:57:57.556 D/DBINFO__STAGE1: ALL Authors
2023-05-18 06:57:57.563 D/DBINFO__STAGE1: 	Author is Lewis Carrol ID is LC001
2023-05-18 06:57:57.563 D/DBINFO__STAGE1: 	Author is John Steinbeck ID is JS001
2023-05-18 06:57:57.563 D/DBINFO__STAGE1: 	Author is William Shakespeare ID is WS001
2023-05-18 06:57:57.564 D/DBINFO__STAGE1: 	Author is Charles Dickens ID is CD001
2023-05-18 06:57:57.564 D/DBINFO__STAGE1: ALL Books
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is David Copperfield ID is b001
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is Oliver ID is b002
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is Alice in Wonderland ID is b003
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is Alice through the Looking Glass ID is b004
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is The Lion, the Witch and the Wardrobe ID is b005
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is Wrath of the grapes ID is b006
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is Day of the Triffids ID is b007
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: 	Book is Something ID is b008
2023-05-18 06:57:57.565 D/DBINFO__STAGE1: All Author Book Refs
2023-05-18 06:57:57.566 D/DBINFO__STAGE1: 	 AID is LC001 BID is b003 DESC is AIW
2023-05-18 06:57:57.566 D/DBINFO__STAGE1: 	 AID is LC001 BID is b004 DESC is ATTLG
2023-05-18 06:57:57.566 D/DBINFO__STAGE1: 	 AID is JS001 BID is b007 DESC is DOTT
2023-05-18 06:57:57.566 D/DBINFO__STAGE1: 	 AID is JS001 BID is b006 DESC is WOTG
2023-05-18 06:57:57.566 D/DBINFO__STAGE1: 	 AID is CD001 BID is b001 DESC is DC
2023-05-18 06:57:57.566 D/DBINFO__STAGE1: 	 AID is CD001 BID is b002 DESC is O
2023-05-18 06:57:57.566 D/DBINFO__STAGE1: Authors with Books
2023-05-18 06:57:57.575 D/DBINFO__STAGE1: Author is Lewis Carrol. Has 2 Books. They are:
    		Book is Alice in Wonderland BID is b003
    		Book is Alice through the Looking Glass BID is b004
2023-05-18 06:57:57.575 D/DBINFO__STAGE1: Author is John Steinbeck. Has 2 Books. They are:
    		Book is Wrath of the grapes BID is b006
    		Book is Day of the Triffids BID is b007
2023-05-18 06:57:57.575 D/DBINFO__STAGE1: Author is William Shakespeare. Has 0 Books. They are:
2023-05-18 06:57:57.575 D/DBINFO__STAGE1: Author is Charles Dickens. Has 2 Books. They are:
    		Book is David Copperfield BID is b001
    		Book is Oliver BID is b002

Whilst after the deletion of book b004 then:-

2023-05-18 06:57:57.577 D/DBINFO__STAGE2: ALL Authors
2023-05-18 06:57:57.579 D/DBINFO__STAGE2: 	Author is Lewis Carrol ID is LC001
2023-05-18 06:57:57.579 D/DBINFO__STAGE2: 	Author is John Steinbeck ID is JS001
2023-05-18 06:57:57.579 D/DBINFO__STAGE2: 	Author is William Shakespeare ID is WS001
2023-05-18 06:57:57.580 D/DBINFO__STAGE2: 	Author is Charles Dickens ID is CD001
2023-05-18 06:57:57.580 D/DBINFO__STAGE2: ALL Books
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: 	Book is David Copperfield ID is b001
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: 	Book is Oliver ID is b002
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: 	Book is Alice in Wonderland ID is b003
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: 	Book is The Lion, the Witch and the Wardrobe ID is b005
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: 	Book is Wrath of the grapes ID is b006
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: 	Book is Day of the Triffids ID is b007
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: 	Book is Something ID is b008
2023-05-18 06:57:57.583 D/DBINFO__STAGE2: All Author Book Refs
2023-05-18 06:57:57.585 D/DBINFO__STAGE2: 	 AID is LC001 BID is b003 DESC is AIW
2023-05-18 06:57:57.585 D/DBINFO__STAGE2: 	 AID is JS001 BID is b007 DESC is DOTT
2023-05-18 06:57:57.585 D/DBINFO__STAGE2: 	 AID is JS001 BID is b006 DESC is WOTG
2023-05-18 06:57:57.585 D/DBINFO__STAGE2: 	 AID is CD001 BID is b001 DESC is DC
2023-05-18 06:57:57.585 D/DBINFO__STAGE2: 	 AID is CD001 BID is b002 DESC is O
2023-05-18 06:57:57.586 D/DBINFO__STAGE2: Authors with Books
2023-05-18 06:57:57.604 D/DBINFO__STAGE2: Author is Lewis Carrol. Has 1 Books. They are:
    		Book is Alice in Wonderland BID is b003
2023-05-18 06:57:57.604 D/DBINFO__STAGE2: Author is John Steinbeck. Has 2 Books. They are:
    		Book is Wrath of the grapes BID is b006
    		Book is Day of the Triffids BID is b007
2023-05-18 06:57:57.604 D/DBINFO__STAGE2: Author is William Shakespeare. Has 0 Books. They are:
2023-05-18 06:57:57.604 D/DBINFO__STAGE2: Author is Charles Dickens. Has 2 Books. They are:
    		Book is David Copperfield BID is b001
    		Book is Oliver BID is b002

i.e. Lewis Carrol still exists even though Alice through the Looking Glass has been deleted (noting that the incorrect title has been ignored i.e. the deletion is based upon the primary key value).

If the last book "b003" is then deleted then :-

2023-05-18 07:15:00.320 D/DBINFO__STAGE2: ALL Authors
2023-05-18 07:15:00.323 D/DBINFO__STAGE2: 	Author is Lewis Carrol ID is LC001
2023-05-18 07:15:00.323 D/DBINFO__STAGE2: 	Author is John Steinbeck ID is JS001
2023-05-18 07:15:00.323 D/DBINFO__STAGE2: 	Author is William Shakespeare ID is WS001
2023-05-18 07:15:00.323 D/DBINFO__STAGE2: 	Author is Charles Dickens ID is CD001
2023-05-18 07:15:00.323 D/DBINFO__STAGE2: ALL Books
2023-05-18 07:15:00.326 D/DBINFO__STAGE2: 	Book is David Copperfield ID is b001
2023-05-18 07:15:00.326 D/DBINFO__STAGE2: 	Book is Oliver ID is b002
2023-05-18 07:15:00.326 D/DBINFO__STAGE2: 	Book is The Lion, the Witch and the Wardrobe ID is b005
2023-05-18 07:15:00.326 D/DBINFO__STAGE2: 	Book is Wrath of the grapes ID is b006
2023-05-18 07:15:00.326 D/DBINFO__STAGE2: 	Book is Day of the Triffids ID is b007
2023-05-18 07:15:00.326 D/DBINFO__STAGE2: 	Book is Something ID is b008
2023-05-18 07:15:00.326 D/DBINFO__STAGE2: All Author Book Refs
2023-05-18 07:15:00.329 D/DBINFO__STAGE2: 	 AID is JS001 BID is b007 DESC is DOTT
2023-05-18 07:15:00.329 D/DBINFO__STAGE2: 	 AID is JS001 BID is b006 DESC is WOTG
2023-05-18 07:15:00.329 D/DBINFO__STAGE2: 	 AID is CD001 BID is b001 DESC is DC
2023-05-18 07:15:00.329 D/DBINFO__STAGE2: 	 AID is CD001 BID is b002 DESC is O
2023-05-18 07:15:00.329 D/DBINFO__STAGE2: Authors with Books
2023-05-18 07:15:00.334 D/DBINFO__STAGE2: Author is Lewis Carrol. Has 0 Books. They are:
2023-05-18 07:15:00.334 D/DBINFO__STAGE2: Author is John Steinbeck. Has 2 Books. They are:
    		Book is Wrath of the grapes BID is b006
    		Book is Day of the Triffids BID is b007
2023-05-18 07:15:00.334 D/DBINFO__STAGE2: Author is William Shakespeare. Has 0 Books. They are:
2023-05-18 07:15:00.334 D/DBINFO__STAGE2: Author is Charles Dickens. Has 2 Books. They are:
    		Book is David Copperfield BID is b001
    		Book is Oliver BID is b002

i.e. Lewis Carrol still exists, however he has 0 books.

huangapple
  • 本文由 发表于 2023年5月17日 23:07:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/76273561.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定