2015-05-06 5 views
26

नहीं हूं मेरे पास केवल पढ़ने-योग्य डेटाबेस कनेक्शन है। कभी-कभी, 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 के स्वामित्व में है, इसलिए मेरे पास जावा कोड से इसकी आसान पहुंच नहीं है।

+0

ध्यान दें कि 'cwac-loaderex' को कुछ समय से बंद कर दिया गया है। क्या यह एक दुर्घटना है जिसे आप विकास के दौरान देख रहे हैं, या केवल उत्पादन में? ध्यान दें कि 'getCount() 'वास्तव में SQL क्वेरी को निष्पादित कर रहा है जिसे आपने लोडर को लोड करने के लिए कहा था, क्योंकि' rawQuery()'/'query()' 'कर्सर 'वापस लौटाता है लेकिन क्वेरी को तत्काल निष्पादित नहीं करता है। – CommonsWare

+0

लोडर और सीडब्ल्यूएसी-लोडरएक्स के उल्लेख को हटा दिया गया। समस्या उनके बिना भी होती है। विकास के दौरान दुर्घटना देखी गई। –

+0

मैं कहूंगा कि यह एक बग है कि कैसे स्क्लाइट फ़्लैग के आधार पर डेटाबेस उदाहरण देता है, संभवतः मल्टीथ्रेडिंग से संबंधित है। मैं आपके सभी परिचालनों के लिए पढ़ने-लिखने योग्य डेटाबेस के सिंगलटन उदाहरण को पकड़ने की कोशिश कर रहा हूं, इसे हल करना चाहिए (रीड-राइट में अपने सभी कनेक्शन खोलना) – njzk2

उत्तर

15

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

(776) SQLITE_READONLY_ROLLBACK

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

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

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

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

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

+4

हाय ग्राहम, क्या आप मुझे मार्गदर्शन कर सकते हैं कि जावा कनेक्शन को एक लिखने योग्य कैसे बनाया जाए? धन्यवाद – user219882

+0

SQLiteDatabase.openDatabase (पथ, शून्य, SQLiteDatabase.OPEN_READWRITE) लौटाएं; – ketom

संबंधित मुद्दे