Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Using @Upsert annotation of room2/room3 and SQLCipherDriver leads to UNIQUE constraint failed exception

Aperta
#95 4 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
32/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
android, java, sqlite

Direzione di ricerca

Start from how SQLCipherDriver surfaces constraint failures versus SupportOpenHelperFactory/SupportSQLiteDriver. Room @Upsert expects androidx.sqlite.SQLiteException (and a uniqueness message) so it can fall back from INSERT to UPDATE; SQLCipher currently throws net.zetetic.database.sqlcipher.SQLiteConstraintException. Align exception type/message with Room’s catch (same class of issue as sqlcipher-android#23 and #84). Done when @Upsert succeeds with SQLCipherDriver on Room 2.x and 3 without UNIQUE constraint failed.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Library version used: 4.19.1
Room version used: 2.8.5 & 3.0.3

I'm currently upgrading to room3 and during the Prepare and modernize in Room 2.x part of the Android documentation I'm running into an runtime error.
At the stage Set the SQLite driver I'm doing it like your documentation says and pass a SQLCipherDriver to the databaseBuilder.

Using the @Upsert annotation (both in room2 and room3) now leads to an UNIQUE constraint failed exception at runtime. This also happens after a complete upgrade to room3.

This does not happen when using the room2 way with SupportOpenHelperFactory.

This is what Claude analyzed:

Room implements @Upsert as:

  1. try a plain INSERT (conflict strategy ABORT),
  2. catch the constraint exception, check it's a uniqueness violation,
  3. fall back to UPDATE.

Step 2 is the fragile part: it is a catch on a specific exception type plus a string match on the message. Room's driver-based adapter catches androidx.sqlite.SQLiteException.

SupportOpenHelperFactory went through Room's SupportSQLiteDriver wrapper, where the error surfaced in a form Room's fallback recognised, so step 3 ran and you never saw the error. SQLCipherDriver hands Room SQLCipher's own
net.zetetic.database.sqlcipher.SQLiteConstraintException instead (the (code 1555); query: … message format is zetetic's native formatter). That type is not androidx.sqlite.SQLiteException, so the catch never fires, the UPDATE
fallback is skipped, and the raw insert failure propagates to you.

This is the same class of bug as sqlcipher-android#23 (https://github.com/sqlcipher/sqlcipher-android/issues/23) (@Upsert + SQLCipher) and robolectric#8469 (https://github.com/robolectric/robolectric/issues/8469) — any driver
that wraps SQLite errors in its own exception hierarchy breaks Room's upsert fallback. sqlcipher-android#84 (https://github.com/sqlcipher/sqlcipher-android/issues/84) tracks the broader Room 3 / SQLiteDriver migration gap.

Lingua principale
Java
Stelle
277
Fork
39
Merge medio
1g 11h
PR unite (30g)
1

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di sqlcipher/sqlcipher-android

Tutte le issue di sqlcipher/sqlcipher-android

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.