Android ORM 框架:GreenDao 資料庫升級
阿新 • • 發佈:2019-01-31
前言
一,GreenDao 預設的升級方式
GreenDao 預設的升級方式是刪除所有舊版,在重新建新表,這樣一來使用者的本地歷史資料則會丟失,這點我們通過DaoMaster 的內部類 DevOpenHelper 原始碼可以瞭解到。
/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name) {
super (context, name);
}
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);//刪除所有舊錶
onCreate(db);// 重新建立新表
}
}
二、自定義升級方式
1,修改 schemaVersion 版本號(schemaVersion 只能往上升,不能降)
greendao {
schemaVersion 2 //資料庫版本號
daoPackage 'com.speedystone.greendaodemo.db' // 設定DaoMaster、DaoSession、Dao包名
targetGenDir 'src/main/java'//設定DaoMaster、DaoSession、Dao目錄
}
2,自定義 OpenHelper :繼承 DaoMaster.OpenHelper,重新 onUpgrade 方法
/**
* Created by Speedy on 2017/7/4.
*/
public class DbHelper extends DaoMaster.OpenHelper {
public DbHelper(Context context, String name) {
super(context, name);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion );
if(newVersion == 2){
// 修改 USER 表
db.execSQL("ALTER TABLE 'USER' ADD 'NICKNAME' String");
}
}
}
3,在初始化GreenDao 階段,採用自定義的 OpenHelper 替換 DaoMaster.DevOpenHelper
/**
* 初始化 GreenDao
*/
private void initGreenDao() {
//DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"test.db");//預設的
DbHelper helper = new DbHelper(this,"test.db");//自定義的 OpenHelper
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}
三,注意事項
1, @Id 標記的ID欄位,對應資料庫列名會轉化為 “_id ”
2, 通過註解建立的表如果沒有使用 @Property 指明表列名,預設表中列名是大寫單詞
例如:
@Entity
public class User {
@Id
private long userId;
private String name;
//指明列名
@Property(nameInDb = "age")
private int age;
}
對應表結構: