2011-12-04 3 views
1

これまで私のSQLiteデータベースの自動化された(ほぼほとんど)onCreate/onUpgradeメソッドに大いに依存してきました。それはうまくいっていて、データベースのバージョン番号を変更してonUpgradeを自動的に実行しなければなりませんでした。最初のクエリで読み取り専用データベースを使用している場合、Androidはデータベースをアップグレードできません

しかし、今、私は私のデータベースに列を追加しようとしたときにその例外に実行して、バージョン番号を変更しています:

SQLiteException: Can't upgrade read-only database from version X to Y 

は自分のアプリケーションの最初のクエリ案の定、私のコードを見てみますSELECTクエリです。要求に書き込みアクセスが必要ないため、getReadableDatabaseを使用して接続を開きます。

私はこのような問題をどのように解決すればよいのだろうかと思っていました。常に​​を使用する必要がありますか? (私のアップデートをパスするための回避策として)確かに、両方のメソッドが使用され、必要なときに接続が読み取り専用アクセスに最適化されているためです。私は利益を失いたくはありません。

+0

「両方のメソッドが存在するのは、そのメソッドが使用され、必要なときに読み取り専用アクセス用に最適化されているためです」 - 最適化AFAIKはありません。 'execSQL()'のようなものへの呼び出しをブロックするだけです。私は時々これにぶつかり、何が起こっているのか、特に一貫していないので、私の人生を理解することができません。おそらく妥当な回避策は 'getWriteableDatabase()'を使うことです。 – CommonsWare

+0

これは異常です...私の現在の回避策は、getWritableDatabase()だけを行い、終了して、必要に応じてデータベースをチェックし、作成し、アップグレードするアプリケーションの "スタート"にメソッドを持たせることです。ああ...(@CommonsWareのところでは、StackOverflowでのAndroidの質問について、一貫して偉大で十分な情報を得て、多くの助けになりました。) – Guillaume

+0

あなたはとてもですようこそ! – CommonsWare

答えて

0

回避方法私は使用しました:私のアプリケーションの "スタート"にちょうどgetWritableDatabase()しかないメソッドを用意し、それを閉じて、必要な場合に必要なすべての作成/更新をトリガーするようにします。私の場合は

-1

いくつかの時間のカラム名が文を作成中に繰り返します。..

create table tbl (Col1 TEXT,Col2 INTEGER,Col3 INTEGER,Col1 INTEGER,Col5 INTEGER); 

のCol1は、繰り返しの2倍であるここと同じように...

+0

これはどの質問に答えるのですか? – laalto

+0

このエラーが発生した場合は、「SQLiteException:読み取り専用データベースをバージョンXからYにアップグレードできません」 –

+0

ソースを見ると(たとえばhttp://androidxref.com/4.4.2_r1/xref/frameworks/ 'onCreate()'や 'onUpgrade()'の呼び出しの前に例外がスローされます。 'create table'のものとは関係ありません。 。 – laalto

0

は、構文エラーがあった:フィールドの一つでしたSQL予約語。 しかし、私はMainActivity.onCreate()

dbHelper.getWritableDatabase().close(); 

を追加する必要がありました構文についてそのエラー・メッセージを参照するには。

関連する問題