3

を使用してAndroidアプリケーションを作成していsqliteます。多くの活動と1つのサービスがあります。複数のスレッドからDBを使用しています。で完全に機能しAndroid 2.Xますが、実行するAndroid 3.Xと常にこのエラーがスローされ、Force Close

05-04 22:17:04.815: I/SqliteDatabaseCpp(8774): sqlite returned: error code = 5, msg = database is locked, db=/data/data/xxx/databases/im
05-04 22:17:04.815: E/SqliteDatabaseCpp(8774): sqlite3_open_v2("/data/data/xxx/databases/im", &handle, 6, NULL) failed
05-04 22:17:04.835: E/SQLiteDatabase(8774): Failed to open the database. closing it.
05-04 22:17:04.835: E/SQLiteDatabase(8774): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:790)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)

なぜそれが起こるのか、そしてそれをどのように解決するのか誰もが知っていますか?

私はインターネットで調査しました、そしてほとんどの人はアドバイスします:

  1. アプリケーションにのみ1つのDB接続を使用します。それを確実にする方法は?サービスとアクティビティの両方でDB接続を共有したいと思います。パブリック静的DB変数を作成することでそれを行う必要がありますか?
  2. ContentProvider-コードで複雑なSQLステートメントを使用しています(いくつかのテーブルの結合、一時テーブルなど)。これらの複雑なSQLステートメントをContentProviderで実行することは可能ですか?


    みんなありがとう。最後に、(1)は私にとってはうまくいきます。しかし、Android2.Xにこの問題がないのはなぜだろうと思います。
4

2 に答える 2

6

1番が答えです。正確にそれを行う方法について、いくつかのスタック回答とブログ投稿があります。

Android での SQLite のベスト プラクティスは何ですか?

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

番号 2 は余分な作業が多く、不要です。ContentProvider が存在するため、他のアプリとデータを共有できます。Sqlite と Android がどのように連携するかを人々が理解していないため、データベース接続を管理するために使用されます。

于 2012-05-04T15:57:38.660 に答える
3

ContentProviderできる限り aと一緒に使用することをお勧めしますLoaderManager。バックグラウンドで自動的にクエリを実行できます。

于 2012-05-04T16:14:41.037 に答える