_Europe · 2026-09-09_
The barcode-list update runs on its own thread while the database is still being opened, dereferenced a null DaoSession and died on a NullPointerException. Nothing then set the flag the startup check item polls, so it ran into its full 120 s timeout and the machine reported 88036. Because the version number is only persisted after that step, the machine considered its list outdated at the next start and repeated the failure - observed 5 to 14 times per machine. The update now waits for the session and reports a failure immediately instead of letting the check item time out.
getAllLast24h filtered the archive on an unindexed column and loaded every match as a full entity, payload included, to read one voucher id from each. The scan held the single SQLite connection, so other threads blocked in waitForConnection - 69 ANRs on one machine in three weeks. The status now selects VOUCHER_ID only, DATE_TIME is indexed (created on open, no schemaVersion bump), and write-ahead logging lets readers work alongside a writer.
At the end of the startup self-check the machine logs every table with its row count plus the database file size, and sends the same line as an info audit entry. Table names come from sqlite_master, so new tables are included automatically. Makes table growth and data lost to a schema migration visible without pulling the database off the machine.