Hallo
Ich programmiere eine App die Room benutzt und habe eine vorhandene Datenbank. Meine Entity sieht so aus:
@Entity
data class PokemonData(
@ColumnInfo(name = "name")
val name: String,
@ColumnInfo(name = "pokedex_id")
val pokedexId: Int,
@ColumnInfo(name = "generation")
val generation: Int,
@ColumnInfo(name = "encounter_needed")
val encounterNeeded: Int,
@ColumnInfo(name = "hunt_method")
val huntMethod: HuntMethod,
@ColumnInfo(name = "tab_index")
val tabIndex: Int
) {
@PrimaryKey(autoGenerate = true)
var internalId: Int = 1
}
Alles anzeigen
Die internalId soll als PrimaryKey dienen, da ein Pokemon mehrmals vorkommen kann und sie dann trotzdem unterscheidbar sein sollen und die internalId fängt bei 1 an und erhöht sich immer um 1. Ich habe mir einen Importer und einen Exporter geschrieben, wobei der der Exporter alles exportiert auch mit inernalId und der Importer setzt dann auch die internalId, sodass "autoGenerate = true" vielleicht unnötig ist? Hier ist meine Insert Methode:
Nun ist ein Datensatz nach dem Importieren in der Datenbank gespeichert und die größte internalId ist zum Beispiel 73. Nun möchte ich ein neues Pokemon hinzufügen, aber ohne die internalId selbst zu setzen, dafür sollte denke ich "autoGenerate = true" sorgen. Allerdings setzt er die internalId dann nicht auf 74, sondern sie bleibt auf 1 und weil es die 1 schon gibt, crasht es.
Nun könnte ich eine Abfrage nach der größten bisherigen internalId machen und diese selbst um 1 erhöhen und auch selbst setzen, aber vielleicht geht es ja auch so, dass Room das übernimmt?
Und hier noch der relevante Fehler:
Caused by: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: PokemonData.internalId (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY[1555])
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:995)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:51)
at androidx.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.java:80)
at de.phil.solidsabissupershinysammlung.database.PokemonDao_Impl.addPokemon(PokemonDao_Impl.java:88)