我在編寫ContentProvider
,它使用SqlOpenHelper
來獲取其數據庫。我剛剛對數據庫做了一些重大更改,因此我將數據庫的版本增加了一個。SqlOpenHelper#onUpgrade(...)在數據庫以可讀方式打開時失敗
這件事發生:
02-13 15:36:15.668: E/AndroidRuntime(15917): FATAL EXCEPTION: AsyncTask #3
02-13 15:36:15.668: E/AndroidRuntime(15917): java.lang.RuntimeException: An error occured while executing doInBackground()
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.os.AsyncTask$3.done(AsyncTask.java:278)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.lang.Thread.run(Thread.java:864)
02-13 15:36:15.668: E/AndroidRuntime(15917): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.company.anothercompany.anotherothercompany/databases/twocompanies
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:262)
02-13 15:36:15.668: E/AndroidRuntime(15917): at com.somo.vertu.provider.FerrariVertuContentProvider.query(FerrariVertuContentProvider.java:94)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.content.ContentProvider$Transport.query(ContentProvider.java:189)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.content.ContentResolver.query(ContentResolver.java:315)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.content.CursorLoader.loadInBackground(CursorLoader.java:42)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:255)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:55)
02-13 15:36:15.668: E/AndroidRuntime(15917): at android.os.AsyncTask$2.call(AsyncTask.java:264)
02-13 15:36:15.668: E/AndroidRuntime(15917): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-13 15:36:15.668: E/AndroidRuntime(15917): ... 4 more
我從query(...)
函數調用getReadableDatabase()
因爲我讀,不寫。在這種情況下,onUpgrade()
意味着什麼都沒有返回,但我正在處理。如何在不需要在ContentProvider#onCreate()
方法中調用getWritableDatabase(...)
的情況下觸發可寫數據庫的升級?或者這是最好的事情?
問題是:你是否使用'SqlOpenHelper'的同一個實例......你應該將'SqlOpenHelper'實例存儲爲字段在ContentProvider中,然後在onUpgrade中使用它,你應該使用這個函數中的第一個參數提供的SQLiteDatabase ... – Selvin 2013-02-13 16:05:23