Versuche eine schreibgeschützte Datenbank zu schreiben ... aber ich bin nicht

Ich habe eine schreibgeschützte Datenbankverbindung. Manchmal, wenn Daten aus der Datenbank mit einem @ gelesen werdSELECT query, wirft einSQLiteReadOnlyDatabaseException.

Ich öffne die Verbindung wie folgt:

return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);

Die Abfrage lautet:

Select * FROM BudgetVersions WHERE entityId = ?

Ich lese Daten aus der Datenbank mitdb.rawQuery(), so was

String query = ...;
Cursor c = db.rawQuery(query, new String[]{ activeBudgetId });
try {
    if (c.moveToFirst()) {            
        bv.versionName = c.getString(c.getColumnIndexOrThrow("versionName"));
        return bv;
    } else {
        return null;
    }
} finally {
    c.close();
}

Sehr selten bekomme ich so einen Absturz beim Aufruf vonc.moveToFirst():

Caused by: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 776)
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Meth,od)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:845)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)

Als Workaround könnte ich stattdessen versuchen, eine schreibbare Datenbankverbindung zu verwenden, aber ich möchte wissen, warum der Absturz passiert.

Die Tabelle, aus der ich lese, ist eine Standard-SQLite-Tabelle:

CREATE TABLE BudgetVersions (
    entityId        VARCHAR  PRIMARY KEY NOT NULL UNIQUE,
    budgetId        VARCHAR  NOT NULL,
    versionName     VARCHAR  NOT NULL,
    dateFormat      VARCHAR,
    currencyFormat  VARCHAR,
    lastAccessedOn  DATETIME,
    isTombstone     BOOL     NOT NULL,
    deviceKnowledge NUMERIC  NOT NULL
);

Ich habe den Absturz sowohl auf einem KitKat-Emulator als auch auf einem Gerät mit Lollipop gesehen.

Da ist eintrenne beschreibbare Verbindung offen für die gleiche Datenbankgleichzeiti, im Besitz einer WebView. Die Datenbank wird durch Javascript-Code im WebView aktualisiert und mit dieser schreibgeschützten Verbindung in der nativen Android / Java-Ebene gelesen.

Ich gehe davon aus, dass dies die ultimative Ursache des Problems sein kann, aber ich möchte im Detail verstehen, warum eine schreibgeschützte Verbindung eine separate schreibbare Verbindung stören würde.

ch bin mir durchaus bewusst, dass der allgemeine Rat darin besteht, eine einzige Verbindung zur Datenbank zu verwenden, aber da die beschreibbare Verbindung im Besitz des @ iWebView, Ich habe vom Java-Code aus keinen einfachen Zugriff darauf.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage