नहीं हूं मेरे पास केवल पढ़ने-योग्य डेटाबेस कनेक्शन है। कभी-कभी, SELECT
क्वेरी के साथ डेटाबेस से डेटा पढ़ने पर, यह 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)
कामकाज के रूप में, मैं इसके बजाय एक लिखने योग्य डेटाबेस कनेक्शन का उपयोग करने का प्रयास कर सकता हूं, लेकिन मैं जानना चाहता हूं कि दुर्घटना क्यों हो रही है।
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
);
मैंने देखा है दुर्घटना दोनों एक किटकैट एमुलेटर और एक डिवाइस लॉलीपॉप चलाने पर होती हैं:
तालिका मैं से पढ़ रहा हूँ एक मानक SQLite टेबल है।
एक ही समय पर एक अलग लिखने योग्य कनेक्शन खुला एक ही डाटाबेस के लिए, एक WebView के स्वामित्व में नहीं है। डेटाबेस को वेबव्यू में जावास्क्रिप्ट कोड द्वारा अपडेट किया जा रहा है, और इस रीड-ओनली कनेक्शन के साथ देशी एंड्रॉइड/जावा परत में से पढ़ा गया है।
मुझे उम्मीद है कि यह समस्या का अंतिम कारण साबित हो सकता है, लेकिन मैं विस्तार से समझना चाहता हूं कि केवल पढ़ने-योग्य कनेक्शन एक अलग लिखने योग्य कनेक्शन में हस्तक्षेप क्यों करेगा।
मुझे अच्छी तरह से पता है कि सामान्य सलाह डेटाबेस के लिए एक कनेक्शन का उपयोग करना है, लेकिन चूंकि लिखने योग्य कनेक्शन WebView
के स्वामित्व में है, इसलिए मेरे पास जावा कोड से इसकी आसान पहुंच नहीं है।
ध्यान दें कि 'cwac-loaderex' को कुछ समय से बंद कर दिया गया है। क्या यह एक दुर्घटना है जिसे आप विकास के दौरान देख रहे हैं, या केवल उत्पादन में? ध्यान दें कि 'getCount() 'वास्तव में SQL क्वेरी को निष्पादित कर रहा है जिसे आपने लोडर को लोड करने के लिए कहा था, क्योंकि' rawQuery()'/'query()' 'कर्सर 'वापस लौटाता है लेकिन क्वेरी को तत्काल निष्पादित नहीं करता है। – CommonsWare
लोडर और सीडब्ल्यूएसी-लोडरएक्स के उल्लेख को हटा दिया गया। समस्या उनके बिना भी होती है। विकास के दौरान दुर्घटना देखी गई। –
मैं कहूंगा कि यह एक बग है कि कैसे स्क्लाइट फ़्लैग के आधार पर डेटाबेस उदाहरण देता है, संभवतः मल्टीथ्रेडिंग से संबंधित है। मैं आपके सभी परिचालनों के लिए पढ़ने-लिखने योग्य डेटाबेस के सिंगलटन उदाहरण को पकड़ने की कोशिश कर रहा हूं, इसे हल करना चाहिए (रीड-राइट में अपने सभी कनेक्शन खोलना) – njzk2