テンセント - アップグレードして、過去に既存のデータを移行する方法データベースの単体バージョン
我々が開発したアプリケーションでは、一般的に、それはそうでデータベース、データ移行、増加した磁力線とをアップグレード関与する時期のデータを使用し、データベースを伴います。例えば、保存エンドポイントは、関連するデータベースファイルに保存されたデータをカスタマイズするユーザーの情報を再開します。
我々のアプリケーションの最初のバージョンV1.0、反復バージョンV1.1で、我々は、データベース内のフィールドを追加しました。だから、V1.0データベースがバージョンV1.1にアップグレードする必要があり、データベースの元のデータのV1.0のバージョンアップが失われることができないときV1.1、
だから、V1.1での場所が違いバージョンを検出することが可能であること、および使用可能なデータベースソフトウェアV1.0のV1.1ソフトウェアにデータベースをアップグレードする必要があります。言い換えれば、V1.0ソフトウェアのデータベーステーブル内のフィールドを増加させ、そしてフィールドにデフォルト値を与えます。データベースアプリケーションがそれをアップグレードする必要が検出する方法は?クラスのメソッドがありますSQLiteOpenHelper
公共ボイドONUPGRADE(SQLiteDatabase DB、INT oldVersion、INT NEWVERSION){}
我々があれば前のオブジェクトを作成すると、着信バージョン番号は裁判官によって呼び出されるバージョン番号よりも大きいoldVersionとNEWVERSIONは、データベースをアップグレードする方法を決定することができます。昔、この機能のフィールドの増加に対応するデータベーステーブルのバージョン、および各レコードに既定値を増加します。開発者は、バージョンへのバージョンからアップグレードする必要のあるデータベースを知っているため、新バージョンと旧バージョンは、パラメータONUPGRADE機能として渡されます。アップグレードが完了すると、データベースは自動的に現在のデータベースのバージョン番号の最新のバージョン番号を格納します。
データベースのアップグレード
SQLiteはALTER TABLEコマンドは、ユーザーが名前を変更したり、既存のテーブルに新しいフィールドを追加することができます提供していますが、テーブルからフィールドを削除することはできません。そして、唯一のOrdersテーブルにフィールドを追加するために、例えば、テーブルのフィールドの末尾に追加することができます。「ALTER TABLE注文AddColumn関数の国」
コードは以下の通りであります:
パブリッククラスOrderDBHelperはSQLiteOpenHelperを拡張{ プライベート静的最終int型DB_VERSION = 1。 プライベート静的最終文字列のDB_NAME =「test.dbという」; public static final String型のTABLE_NAME = "受注"; 公共OrderDBHelper(コンテキスト・コンテキスト、INTバージョン){ スーパー(文脈、DB_NAME、ヌル、バージョン)。 } @Override 公共ボイドのonCreate(SQLiteDatabaseデシベル){ 文字列のSQL = "しない存在する場合、テーブルを作成する" + TABLE_NAME + "(id整数主キー、" + "CustomNameテキスト、OrderPrice整数)"。 db.execSQL(SQL)。 } @Override 公共ボイドONUPGRADE(SQLiteDatabase DB、INT oldVersion、INT NEWVERSION){ Log.e( "オーウェン"、 " IF(NEWVERSION == 2){ db.execSQL( "ALTER TABLE" + TABLE_NAME + "COLUMN国ADD"); カーソルCRは= db.rawQueryは(+ TABLE_NAME、ヌル"SELECT * FROM"); 一方、(cr.moveToNext()){ 文字列名= cr.getString(cr.getColumnIndex( "CustomName")); ContentValues値=新しいContentValues()。 values.put( "CustomName"、名); values.put( "国"、 "中国"); db.update(TABLE_NAME、値、 "CustomName =?"、新しいString [] {名前})。 } cr.close()。 } } OrderDBHelper orderDBHelper =新しいOrderDBHelper(その2)。 SQLiteDatabaseデシベル= orderDBHelper。 ContentValues contentValues =新しいContentValues(); contentValues.put( "OrderPrice"、100); contentValues.put( "CustomName"、 "OwenChan"); db.insert(OrderDBHelper.TABLE_NAME、ヌル、contentValues)。 Log.e( "オーウェン"、 "仕上げを作成します"); カーソルCRは= db.rawQueryは(+ OrderDBHelper.TABLE_NAME、ヌル"SELECT * FROM"); 一方、(cr.moveToNext()){ 文字列名= cr.getString(cr.getColumnIndex( "CustomName")); Log.e( "オーウェン"、 "名:" +名)。 文字列の国= cr.getString(cr.getColumnIndex( "国")); Log.e( "オーウェン"、 "国:" +国)。 } cr.close()。 db.close();
データベースの移行
データベースを移行するためにいくつかのステップに分けることができます
1、一時テーブルへのテーブルの名前
ALTER TABLE RENAME注文は_order TO。
2、新しいテーブルを作成します
CreateTableテスト(ID VARCHAR(32)PRIMARY KEY、CustomName VARCHAR(32)NOTNULL、国VARCHAR(16)NOTNULL)。
3、データのインポート
INSERTINTO注文のSELECT ID、「」、_order FROM年齢。
4、一時テーブルを削除します
DROPTABLE _order;
上記の4つの工程を経て、新しいデータベース構造へのデータベースの移行の古い構造を完了することができ、また、データをアップグレードするので失われないことを保証することができました。あなたが減少したフィールドで遭遇した場合はもちろん、それはまた、一時テーブルを作成することによって達成することができます。
次のようにコードは次のとおりです。
@Override 公共ボイドONUPGRADE(SQLiteDatabase DB、INT oldVersion、INT NEWVERSION){ IF(NEWVERSION == 2){ 文字列str = " ''; db.beginTransaction(); db.execSQL( "ALTER TABLE注文RENAME TO _order") ; db.execSQL( "表オーダー(id整数主キーオートインクリメント、CustomName VARCHAR(20)NOT NULLを作成し、" + "国VARCHAR(32)NULL NOT、OrderPrice VARCHAR(16)NOT NULL)"); db.execSQL( "INSERT INTO注文SELECT ID、" + STR + STR + "CustomName、_order FROM OrderPrice"); db.setTransactionSuccessful(); db.endTransaction(); } }
複数のデータベースのバージョンアップ
V1.0、V2.0は、我々が開発しているV3.0:我々はプログラムを開発する場合には、2つのバージョンをリリースしました。バージョン番号は、それぞれ1、2、です。この場合、どのようにアップグレードする必要がありますか?ユーザーの選択は、以下のとおりです。
V1.0 - > V3.0のDB 1 - > 2
V2.0 - > V3.0のDB 2 - > 3
各データベースは、データベースのバージョンは、定義されている必要がありますが、テーブル表Cを追加したい場合は、V3.0を変更したい場合は、たとえば、V1.0データベースは、それは、二つのテーブルのテーブルAとテーブルB、V2.0かもしれ表し次のように表Cには、データベースが構成されています。
V1.0 - >テーブルA、テーブルB V1.2 - >テーブルA、テーブルB、表C V1.3 - >テーブルA、テーブルB、表C(変更)
コードは以下の通りであります:
@Override 公共ボイドONUPGRADE(SQLiteDatabase DB、INT oldVersion、INT NEWVERSION){ IF(1 == oldVersion){ 文字列のSQL = "テーブルCを作成..."。 db.execSQL(SQL)。 oldVersion = 2。 } IF(2 == oldVersion){ //変更C oldVersion = 3。 } }
既存のデータベースをインポートします
/ ** *オーウェンチャンによって作成された 2017年9月26日に*。 * / publicクラスDBManagerの{ = "com.example.sql"パブリック静的最終的な文字列PACKAGE_NAME。 public static final String型のDB_NAME = "table.db"。 public static final String型DB_PATH = "/データ/データ/" + PACKAGE_NAME。 プライベートコンテキストmContext。 公共DBManagerの(コンテキストmContext){ this.mContext = mContext。 } 公共SQLiteDatabase OpenDatabaseメソッド(){ 戻りSQLiteDatabase.openOrCreateDatabase(DB_PATH + "/" + DB_NAME、NULL); } 公共ボイドimportDB(){ ファイルファイル=新しいファイル(DB_PATH + "/" + DB_NAME)。 (もし! FileOutputStreamアウト=新しいのFileOutputStream(ファイル); int型のバッファ= 1024; =のmContext.getResourcesにおける入力ストリーム()openRawResource(R.raw.xxxx)。 バイト[] BTS =新しいバイト[緩衝液]。 int型な長さ。 一方、((な長さ= in.read(BTS))> 0){ out.write(BTS、0、bts.length)。 } out.close()。 in.close(); }キャッチ(例外e){ e.printStackTrace(); } } } }
呼ばれます
@Override 保護ボイドonResume(){ super.onResume()。 DBManagerのDBManagerの=新しいDBManagerの(この); dbManager.importDB(); SQLiteDatabase DB = dbManager.openDataBase()。 db.execSQL(「あなたがやりたいです」); }
私について
あなたがクリックすることができます詳細については私に 、そして非常にみんなと共有したい、と一般的な進歩は
、現在プログラマで、Androidの開発者が知識を共有するために、だけでなく、技術的な人々を共有するだけでなく、経験をインタビューし、個人的な要約を含め、職場での経験を育ちました、あなたはそれほど少し回り道を行くようにしたいです。