android - एक पाठक डेटाबेस लिखने का प्रयास ... लेकिन मैं नहीं हूं




1 Answers

इसे एक लिखने योग्य डेटाबेस कनेक्शन में बदलकर हल किया गया। सुराग 776 त्रुटि कोड के लिए प्रलेखन में था:

(776) SQLITE_READONLY_ROLLBACK

SQLITE_READONLY_ROLLBACK त्रुटि कोड SQLITE_READONLY के लिए एक विस्तारित त्रुटि कोड है। SQLITE_READONLY_ROLLBACK त्रुटि कोड इंगित करता है कि डेटाबेस खोला नहीं जा सकता है क्योंकि इसमें एक गर्म पत्रिका है जिसे वापस लुढ़कने की आवश्यकता है लेकिन ऐसा नहीं हो सकता क्योंकि डेटाबेस केवल पढ़ा जाता है।

विकास के दौरान, मैं अक्सर एक नया संस्करण स्थापित करने और चलाने के लिए वर्तमान में चल रहे ऐप को बाधित कर रहा हूं। इससे वर्तमान में चल रहे ऐप को सिस्टम द्वारा बल-रोक दिया जा सकता है। यदि वेबव्यू में जावास्क्रिप्ट कोड डेटाबेस के लेखन के बीच में अलग-अलग लिखने योग्य कनेक्शन के माध्यम से होता है जब ऐप को नियुक्त किया जाता है, तो एक गर्म पत्रिका पीछे छोड़ी जाएगी।

जब ऐप का नया संस्करण शुरू होता है, तो देशी जावा कोड में केवल-पढ़ने के लिए डेटाबेस कनेक्शन खोला जाता है। जब यह कनेक्शन पत्रिका को धक्का देता है, तो यह जर्नल को वापस रोल करने की कोशिश करता है। और क्योंकि यह केवल पढ़ने के लिए कनेक्शन है, यह विफल रहता है।

(यह परिवर्तन करने के बाद स्टार्टअप पर तुरंत दुर्घटनाग्रस्त होने के साथ फिट बैठता है।)

इसलिए जावा कनेक्शन को एक लिखने योग्य कनेक्शन बनाने के लिए सही फिक्स है। यह कनेक्शन सामान्य ऑपरेशन के दौरान कभी भी लिखने का प्रयास नहीं करता है, लेकिन वेबव्यू के लिखने योग्य कनेक्शन के माध्यम से पिछले बाधित लेखन से पुनर्प्राप्त होने पर इसे लिखना चाहिए।

मेरे पास केवल पढ़ने के लिए डेटाबेस कनेक्शन है। कभी-कभी, किसी क्वेरी क्वेरी के साथ डेटाबेस से डेटा पढ़ने पर, यह SQLiteReadOnlyDatabaseException फेंकता है।

मैं इस तरह कनेक्शन खोलता हूं:

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

क्वेरी है:

Select * FROM BudgetVersions WHERE entityId = ?

मैं db.rawQuery() का उपयोग कर डेटाबेस से डेटा पढ़ता हूं, इस तरह:

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();
}

बहुत ही कम, मुझे इस तरह की दुर्घटना हो जाती है, कॉल के अंदर c.moveToFirst() :

Caused by: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 776)
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
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)

एक कामकाज के रूप में, मैं इसके बजाय एक लिखने योग्य डेटाबेस कनेक्शन का उपयोग करने का प्रयास कर सकता था, लेकिन मैं जानना चाहता हूं कि दुर्घटना क्यों हो रही है।

जिस तालिका से मैं पढ़ रहा हूं वह एक मानक SQLite तालिका है:

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
);

मैंने देखा है कि क्रैश एक किटकैट एमुलेटर और लॉलीपॉप चलाने वाली डिवाइस दोनों पर होता है।

वेबव्यू के स्वामित्व वाले एक ही समय में एक ही डेटाबेस के लिए एक अलग लिखने योग्य कनेक्शन खुला है। डेटाबेस को वेबव्यू में जावास्क्रिप्ट कोड द्वारा अपडेट किया जा रहा है, और इस रीड-ओनली कनेक्शन के साथ देशी एंड्रॉइड / जावा परत में से पढ़ा गया है।

मुझे उम्मीद है कि यह समस्या का अंतिम कारण साबित हो सकता है, लेकिन मैं विस्तार से समझना चाहता हूं कि केवल पढ़ने-योग्य कनेक्शन एक अलग लिखने योग्य कनेक्शन में हस्तक्षेप करेगा।

मुझे अच्छी तरह से पता है कि सामान्य सलाह डेटाबेस के लिए एक कनेक्शन का उपयोग करना है, लेकिन चूंकि लिखने योग्य कनेक्शन WebView स्वामित्व में है, इसलिए मेरे पास जावा कोड से इसकी आसान पहुंच नहीं है।




Related