BAT就職活動まくる|あなたは、時間の残高の秋のトリックオンラインアプリケーション、テンセントのインタビューの経験の外出

テンセント - アップグレードして、過去に既存のデータを移行する方法データベースの単体バージョン

我々が開発したアプリケーションでは、一般的に、それはそうでデータベース、データ移行、増加した磁力線とをアップグレード関与する時期のデータを使用し、データベースを伴います。例えば、保存エンドポイントは、関連するデータベースファイルに保存されたデータをカスタマイズするユーザーの情報を再開します。

我々のアプリケーションの最初のバージョン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の開発者が知識を共有するために、だけでなく、技術的な人々を共有するだけでなく、経験をインタビューし、個人的な要約を含め、職場での経験を育ちました、あなたはそれほど少し回り道を行くようにしたいです。

おすすめ

転載: www.cnblogs.com/1157760522ch/p/11670679.html