@@ -39,7 +39,7 @@ public abstract class SQLiteOpenHelper {
3939 private final CursorFactory mFactory ;
4040 private final int mNewVersion ;
4141
42- private SQLiteDatabase mDatabaseRO , mDatabaseRW = null ;
42+ private SQLiteDatabase mDatabase = null ;
4343 private boolean mIsInitializing = false ;
4444
4545 /**
@@ -75,8 +75,8 @@ public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int
7575 * @return a read/write database object valid until {@link #close} is called
7676 */
7777 public synchronized SQLiteDatabase getWritableDatabase (String password ) {
78- if (mDatabaseRW != null && mDatabaseRW .isOpen ()) {
79- return mDatabaseRW ; // The database is already open for business
78+ if (mDatabase != null && mDatabase .isOpen () && ! mDatabase . isReadOnly ()) {
79+ return mDatabase ; // The database is already open for business
8080 }
8181
8282 if (mIsInitializing ) {
@@ -91,7 +91,7 @@ public synchronized SQLiteDatabase getWritableDatabase(String password) {
9191
9292 boolean success = false ;
9393 SQLiteDatabase db = null ;
94- if (mDatabaseRW != null ) mDatabaseRW .lock ();
94+ if (mDatabase != null ) mDatabase .lock ();
9595 try {
9696 mIsInitializing = true ;
9797 if (mName == null ) {
@@ -135,13 +135,13 @@ public synchronized SQLiteDatabase getWritableDatabase(String password) {
135135 } finally {
136136 mIsInitializing = false ;
137137 if (success ) {
138- if (mDatabaseRW != null ) {
139- try { mDatabaseRW .close (); } catch (Exception e ) { }
140- mDatabaseRW .unlock ();
138+ if (mDatabase != null ) {
139+ try { mDatabase .close (); } catch (Exception e ) { }
140+ mDatabase .unlock ();
141141 }
142- mDatabaseRW = db ;
142+ mDatabase = db ;
143143 } else {
144- if (mDatabaseRW != null ) mDatabaseRW .unlock ();
144+ if (mDatabase != null ) mDatabase .unlock ();
145145 if (db != null ) db .close ();
146146 }
147147 }
@@ -161,14 +161,21 @@ public synchronized SQLiteDatabase getWritableDatabase(String password) {
161161 * or {@link #close} is called.
162162 */
163163 public synchronized SQLiteDatabase getReadableDatabase (String password ) {
164- if (mDatabaseRO != null && mDatabaseRO .isOpen ()) {
165- return mDatabaseRO ; // The database is already open for business
164+ if (mDatabase != null && mDatabase .isOpen ()) {
165+ return mDatabase ; // The database is already open for business
166166 }
167167
168168 if (mIsInitializing ) {
169169 throw new IllegalStateException ("getReadableDatabase called recursively" );
170170 }
171171
172+ try {
173+ return getWritableDatabase (password );
174+ } catch (SQLiteException e ) {
175+ if (mName == null ) throw e ; // Can't open a temp database read-only!
176+ Log .e (TAG , "Couldn't open " + mName + " for writing (will try read-only):" , e );
177+ }
178+
172179 SQLiteDatabase db = null ;
173180 try {
174181 mIsInitializing = true ;
@@ -193,11 +200,11 @@ public synchronized SQLiteDatabase getReadableDatabase(String password) {
193200
194201 onOpen (db );
195202 Log .w (TAG , "Opened " + mName + " in read-only mode" );
196- mDatabaseRO = db ;
197- return mDatabaseRO ;
203+ mDatabase = db ;
204+ return mDatabase ;
198205 } finally {
199206 mIsInitializing = false ;
200- if (db != null && db != mDatabaseRO ) db .close ();
207+ if (db != null && db != mDatabase ) db .close ();
201208 }
202209 }
203210
@@ -207,14 +214,9 @@ public synchronized SQLiteDatabase getReadableDatabase(String password) {
207214 public synchronized void close () {
208215 if (mIsInitializing ) throw new IllegalStateException ("Closed during initialization" );
209216
210- if (mDatabaseRO != null && mDatabaseRO .isOpen ()) {
211- mDatabaseRO .close ();
212- mDatabaseRO = null ;
213- }
214-
215- if (mDatabaseRW != null && mDatabaseRW .isOpen ()) {
216- mDatabaseRW .close ();
217- mDatabaseRW = null ;
217+ if (mDatabase != null && mDatabase .isOpen ()) {
218+ mDatabase .close ();
219+ mDatabase = null ;
218220 }
219221 }
220222
0 commit comments