objectbox / objectbox/objectbox-java
Entities in Backlink ToMany reappearing after removing
Personne n'a encore pris cette issue.
- Langage dominant
- Java
- Étoiles
- 4.6k
- Forks
- 311
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
Describe the bug
When trying to remove entities from a One-To-Many relationship, they keep reappearing in the database after put() when first removing from the relationship and afterwards from box
Basic info (please complete the following information):
- ObjectBox version: 3.1.0
- Reproducibility: always
- Device: Galaxy S10 (Android 11), OnePlus 6T (Android 11), Pixel 4 (Android 12)
- OS: Android 11 and 12
To Reproduce
Steps to reproduce the behavior:
- Create 2 entities with a 1:N relationship (
oneandmany) - Add some entities to the ToMany (
many) of the other (one). - Remove 1 entity from the relationship with
one.many.removeById(id) - Remove the entity from the box
box.remove(id) - Put the parent (
one) in the box again (overriding it)
Expected behavior
No matter the order, if an entity gets deleted from the box and the relation and is nowhere to be found, it should not reappear in the box.
Code
My Repo
Example code where I tested the issue in a Kotlin project
fun main(args: Array<String>) {
val store: BoxStore = MyObjectBox.builder().name("objectbox-notes-db").build()
val imageBox = store.boxFor<Image>().also { it.removeAll() }
val propertyBox = store.boxFor<Property>().also { it.removeAll() }
val originalImage = Image()
imageBox.put(originalImage)
originalImage.apply {
properties.addAll(listOf(
Property(name = "h1"),
Property(name = "h2"),
Property(name = "h3")
))
}
imageBox.put(originalImage)
println("Boxed Properties: " + propertyBox.all.map { it.id })
println("Original Image Properties: " + originalImage.properties.map { it.id })
val removedID = propertyBox.all.first().id
println("Removing id ${removedID}")
val image = imageBox.get(originalImage.id).also {
it.properties.removeById(removedID) //changing the order of these 2 will make
propertyBox.remove(propertyBox.all.first().id) // it work as expected
it.properties.applyChangesToDb()
}
println("--------------")
println("Both houldn't have ${removedID}: ")
println("Boxed Properties before put: " + propertyBox.all.map { it.id })
println("New Image Properties before put: " + image.properties.map { it.id })
imageBox.put(image)
println("--------------")
println("Should still not have ${removedID}")
println("Boxed Properties after put: " + propertyBox.all.map { it.id })
println("New Image Properties after put: " + image.properties.map { it.id })
}
@Entity
data class Image(
@Id
var id: Long = 0,
....
) {
@Backlink(to = "image")
lateinit var properties: ToMany<Property>
}
@Entity
data class Property(
@Id
var id: Long = 0,
..
) {
lateinit var image: ToOne<Image>
}
Additional context
Flipping the order (e.g. first removing the entity from the box) and THEN removing it from the ToMany works.
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par la reproduction en Kotlin et app/src/main/java/com/mobilecomputing/collit/data/datasource/LocalImageDataSource.kt, en vous concentrant sur ToMany.removeById, applyChangesToDb et Box.put. Reproduisez les deux ordres de suppression et suivez la mise à jour de la relation. C’est terminé lorsque la Property supprimée ne réapparaît pas après l’enregistrement du parent, quel que soit l’ordre des opérations.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- android, kotlin
- Domaine
- database, mobile
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100