Androidデータベースのアップグレード、データの移行.GreenDaoも適用されます
4533 ワード
バージョンの反復では、データベースフィールドを追加したり、削除したり、変更したりする必要があります.この場合、データが失われないように、既存のデータを移行する必要があります.データベースの移行には、次の手順に従います.①テンポラリ・テーブルを作成し、元のデータをテンポラリ・テーブルにコピーします. ②元のテーブルを削除し、元のテーブルのデータはすでに一時テーブルにバックアップされており、不要であり、削除を行う. ③新しいテーブルを作成し、新しいテーブルを作成する方法を呼び出し、すべての新しいテーブルを作成します. ④元のテーブルのデータを復元し、仮のテーブルのデータを新しいテーブルに復元します. ⑤テンポラリ・テーブルを削除し、すべてのステップを完了します.
Show Code:
使用方法以下の例を示します. E.g: GreenDao
これは私の最初の文章で、みんなを助けることができることを望んで、同時に私自身に記憶を深めます.ありがとうございます.
Show Code:
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by CY on 2016/10/24.
* Email: [email protected]
*/
public class UpgradeHelper {
/**
*
*
* @param db db
* @param openHelper
*/
public void upgrade(SQLiteDatabase db, SQLiteOpenHelper openHelper) {
List tables = queryAllTables(db);
for (String tableName : tables) {
if ("android_metadata".equals(tableName)||"sqlite_sequence".equals(tableName)) {// ,
continue;
}
String tempTableName = tableName + "_Temp";
createTempTables(db, tableName, tempTableName);//
dropTable(db, tableName);//
openHelper.onCreate(db);//
restoreData(db, tableName, tempTableName);//
dropTable(db, tempTableName);//
}
}
/**
*
*/
private void createTempTables(SQLiteDatabase db, String tableName, String tempTableName) {
copyTable(db, tableName, tempTableName);
}
/**
*
*
* @param db
*/
private void dropTable(SQLiteDatabase db, String tableName) {
String sql = "DROP TABLE IF EXISTS " + tableName;
db.execSQL(sql);
}
/**
*
*
* @param db
* @return
*/
private List queryAllTables(SQLiteDatabase db) {
List list = new ArrayList<>();
String sql = "SELECT name FROM SQLITE_MASTER WHERE type='table' ORDER BY name";
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()) {
list.add(cursor.getString(0));
}
cursor.close();
return list;
}
/**
*
*
* @param db
* @param oldTableName
* @param newTableName
*/
private void copyTable(SQLiteDatabase db, String oldTableName, String newTableName) {
String sql = "CREATE TABLE IF NOT EXISTS " + newTableName + " AS SELECT * FROM " + oldTableName;
db.execSQL(sql);
}
/**
*
*
* @param db
* @param tableName
* @param tableNameTemp
*/
private void restoreData(SQLiteDatabase db, String tableName, String tableNameTemp) {
String columns = TextUtils.join(",", queryColumns(db, tableNameTemp));
String sql = "INSERT INTO " + tableName + "(" + columns + ") SELECT " + columns + " FROM " + tableNameTemp;
db.execSQL(sql);
}
/**
*
*
* @return
*/
private String[] queryColumns(SQLiteDatabase db, String tableName) {
String sql = "SELECT * FROM " + tableName;
Cursor cursor = db.rawQuery(sql, null);
String[] columnNames = cursor.getColumnNames();
cursor.close();
return columnNames;
}
}
使用方法以下の例を示します.
public class MergeDevOpenHelper extends DaoMaster.DevOpenHelper {
public MergeDevOpenHelper(Context context, String name) {
super(context, name);
}
public MergeDevOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
new UpgradeHelper().upgrade(db, this);
}
}
}
}
DaoMaster.DevOpenHelper devOpenHelper = new MergeDevOpenHelper(mContext, "data.db");
SQLiteDatabase db = devOpenHelper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
これは私の最初の文章で、みんなを助けることができることを望んで、同時に私自身に記憶を深めます.ありがとうございます.