@@ -39,7 +39,7 @@ public abstract class SQLiteOpenHelper {
39
39
private final CursorFactory mFactory ;
40
40
private final int mNewVersion ;
41
41
42
- private SQLiteDatabase mDatabaseRO , mDatabaseRW = null ;
42
+ private SQLiteDatabase mDatabase = null ;
43
43
private boolean mIsInitializing = false ;
44
44
45
45
/**
@@ -75,8 +75,8 @@ public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int
75
75
* @return a read/write database object valid until {@link #close} is called
76
76
*/
77
77
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
80
80
}
81
81
82
82
if (mIsInitializing ) {
@@ -91,7 +91,7 @@ public synchronized SQLiteDatabase getWritableDatabase(String password) {
91
91
92
92
boolean success = false ;
93
93
SQLiteDatabase db = null ;
94
- if (mDatabaseRW != null ) mDatabaseRW .lock ();
94
+ if (mDatabase != null ) mDatabase .lock ();
95
95
try {
96
96
mIsInitializing = true ;
97
97
if (mName == null ) {
@@ -135,13 +135,13 @@ public synchronized SQLiteDatabase getWritableDatabase(String password) {
135
135
} finally {
136
136
mIsInitializing = false ;
137
137
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 ();
141
141
}
142
- mDatabaseRW = db ;
142
+ mDatabase = db ;
143
143
} else {
144
- if (mDatabaseRW != null ) mDatabaseRW .unlock ();
144
+ if (mDatabase != null ) mDatabase .unlock ();
145
145
if (db != null ) db .close ();
146
146
}
147
147
}
@@ -161,14 +161,21 @@ public synchronized SQLiteDatabase getWritableDatabase(String password) {
161
161
* or {@link #close} is called.
162
162
*/
163
163
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
166
166
}
167
167
168
168
if (mIsInitializing ) {
169
169
throw new IllegalStateException ("getReadableDatabase called recursively" );
170
170
}
171
171
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
+
172
179
SQLiteDatabase db = null ;
173
180
try {
174
181
mIsInitializing = true ;
@@ -193,11 +200,11 @@ public synchronized SQLiteDatabase getReadableDatabase(String password) {
193
200
194
201
onOpen (db );
195
202
Log .w (TAG , "Opened " + mName + " in read-only mode" );
196
- mDatabaseRO = db ;
197
- return mDatabaseRO ;
203
+ mDatabase = db ;
204
+ return mDatabase ;
198
205
} finally {
199
206
mIsInitializing = false ;
200
- if (db != null && db != mDatabaseRO ) db .close ();
207
+ if (db != null && db != mDatabase ) db .close ();
201
208
}
202
209
}
203
210
@@ -207,14 +214,9 @@ public synchronized SQLiteDatabase getReadableDatabase(String password) {
207
214
public synchronized void close () {
208
215
if (mIsInitializing ) throw new IllegalStateException ("Closed during initialization" );
209
216
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 ;
218
220
}
219
221
}
220
222
0 commit comments