0

ContentProviderを使用してデータベースを取得する を書いていSqlOpenHelperます。データベースに大きな変更を加えたので、データベースのバージョンを 1 つ上げました。

これが起こりました:

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

書き込みではなく読み取りを行っているためgetReadableDatabase()、関数から呼び出しています。query(...)この場合onUpgrade()、何も返されないことを意味しますが、私はそれを処理しています。getWritableDatabase(...)メソッドを呼び出すだけでなく、書き込み可能なデータベースでアップグレードをトリガーするにはどうすればよいContentProvider#onCreate()ですか? それともそれが最善の方法ですか?

4

1 に答える 1

1

リライト

次の 3 つのオプションがあります。

  1. 最も簡単な方法は、単純に を呼び出すことgetWritableDatabase()です。
  2. 最新のデータベース バージョンを (おそらく SharedPreference ファイルに) 保存することもできます。次に、データベースを内部でアップグレードする必要があるかどうかを確認します。必要な場合は、代わりにgetReadableDatabase()こっそりと呼び出しgetWritableDatabase()ます。
  3. これは最も複雑なアプローチです。アップグレードが発生したときに書き込み可能なバージョンを開く SQLiteOpenHelper の独自のバージョンを作成する必要があります...
于 2013-02-13T15:57:08.170 に答える