Android不能直接删除表中的某个字段,可以通过以下四步实现这个功能。
- 创建一个新表,只设定想要的字段
2. 将原来表中的数据复制过来,
3. 将原表删除
4. 将新建的表改名
package com.cdc.viewModel;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;
@Database(entities = {Word.class},version=5,exportSchema = false)
public abstract class WordDataBase extends RoomDatabase {
private static WordDataBase INSTANCE;
//单例模式
public static synchronized WordDataBase getInstance(Context context){
if(INSTANCE==null){
INSTANCE= Room.databaseBuilder(context.getApplicationContext(),WordDataBase.class,"Word_database")
//.allowMainThreadQueries() 强制要求在主线程运行(真实环境中不使用)
//.fallbackToDestructiveMigration()//破坏试的迁移.原有的数据被清空,重新建立新表
.addMigrations(MIGRATION_4_5)
.build();
}
return INSTANCE;
}
public abstract WordDao getWordDao();
//版本号 3到4
static final Migration MIGRATION_3_4=new Migration(3,4) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//没有布尔值,用INTEGER代替
//使用"ALTER TABLE Word ADD COLUMN bar_data2 INTEGER NOT NULL DEFAULT 1"出错。
//使用下面分开的形式,可以正确执行
database.execSQL("ALTER TABLE Word "+" ADD COLUMN bar_data2 INTEGER "+" NOT NULL DEFAULT 1");
}
};
//版本号 4到5 没有办法直接删除某一列。可以通过以下四步完成删除某一列的效果
static final Migration MIGRATION_4_5=new Migration(4,5) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//1.创建一个新表WordTemp,只设定想要的字段
database.execSQL("CREATE TABLE WordTemp "+
"( id INTEGER "+" PRIMARY KEY NOT NULL ,"+
" english_word TEXT ,"+
" chinese_meaning TEXT "+
" ) "
);
//2.将原来表中的数据复制过来,
database.execSQL(" INSERT INTO WordTemp (id,english_word,chinese_meaning) " +
"SELECT id,english_word,chinese_meaning FROM Word "
);
//3. 将原表删除
database.execSQL(" DROP TABLE Word ");
//4.将新建的表改名
database.execSQL(" ALTER TABLE WordTemp RENAME to Word");
}
};
}