2017-11-21 8 views
0

データベースのプラグマのDBadapterとuser_versionのDBバージョンの意味が全く混乱しています。SQLite DBのバージョンがuser_versionと異なる

DBバージョン= 4を使用してテストし、バックアップを作成し、DBブラウザを使用してPCで開いたところ、「SQL PRAGMA user_version」が52を返しました!

「PRAGMA user_version = 4」を使用してバージョンを一致させると、復元しないファイルが生成されます。

db version = 5を使用した新しいテストでは、プラグマuser_version 53!

dbバージョン<でビルドされたデバッグバリアントはすべてクラッシュします。

db version = 1を使用するには、リリース版をビルドしてデバッグバージョンをアンインストールする必要がありました。

今回は、DBブラウザで開いているバックアップファイルにuser_version 49が表示されています。

上記のバックアップのuser_versionを53から49に編集すると、データベースが正常に復元されます。

リリースバリアントをアンインストールし、バックデバッグバージョンに私は、DBのバージョン= 1でアプリケーションを実行することができますがuser_versionはまだ質問49

た:user_versionマッチDBのバージョンや周りの他の方法を作るためにどのように回復させます可能?

+0

Androidの 'SQLiteOpenHelper'は' PRAGMA user_version'を直接実行します。 「DBブラウザ」はどのツールを意味していますか?実際にSQLコマンドを実行しましたか?正しいコマンドを実行してもよろしいですか? –

+0

SQLiteのDBブラウザはこちらからダウンロードできます。http://sqlitebrowser.org/ SQLクエリ:PRAGMA user_version – alberto

答えて

0

質問:DBバージョンまたはそれ以外の方法で一致するようにuser_versionを作成する方法 復元を可能にするには?

(SQLiteOpenHelperサブクラスは、データベースを開いた前user_version使用を強制するには: -

db.setVersion(version); 

or via 

db.execSQL("PRAGMA user_version=" + Integer.toString(version),null); 

デシベルは、それぞれのSQLiteDatabaseとバージョンがDBのバージョンとintであるところ。

が交互にあなたがSQLiteOpenHelperサブクラスのonDowngradeメソッドをオーバーライドすることができ、これはその後、あたりとして例外にはなりません: -

onDowngradeは、APIレベル11

無効onDowngrade(SQLiteDatabase DBに追加しました int oldVersion、 int newVersion)

データベースをダウングレードする必要があるときに呼び出されます。これは、onUpgrade(SQLiteDatabase、int、int)メソッドに似ていますが、現在のバージョンが要求されたバージョンよりも新しい場合は常に と呼ばれます。ただし、この メソッドは抽象型ではないため、顧客が に実装することは必須ではありません。 オーバーライドされない場合、デフォルトの実装では のダウングレードが拒否され、SQLiteExceptionがスローされます。

このメソッドはトランザクション内で実行されます。例外がスローされた場合は、 すべての変更が自動的にロールバックされます。

user_versionは、DBバージョン(正しくリコールした場合)に設定されます。これは、onUpgradeがそれに応じて実装されていると仮定します。

+0

Joveによると、これはアダプタのこの愚かな宣言(ウェブサイトからのもの)に起因しています:static final int DBVERSION = '1';これは、整数値49のASCII値 '1'にバージョンを設定します。同様に '2'は50なので、PRAGMA user_valueは49または50に設定されます。クォートを削除してアプリを再インストールするだけで問題が解決しました - ありがとうございます。 BTW私は思うdb.execSQL( "PRAGMA user_version =" + Integer.toString(version)、null); nullを必要としません。 – alberto

+0

@alberto oops re null、rawQueryから変更してnullを削除しませんでした。 – MikeT

1

私はそれがすべて(ウェブサイトから)DBadapterで愚かな申告によるものであった解決策を見つける:

static final int DBVERSION = '1' ; // note single quaotes 

これは同様に「2整数49である「1」のASCII値にバージョンを設定します'は50ですので、PRAGMA user_valueは49または50に設定されています!単に引用符を削除して、アプリを再インストールすると私の問題は解決しました。 dbのバージョンとuser_versionは、dbを復元する際の重要な要素です。

関連する問題