sql把两个字段合并到一个字段中_Android中Room的使用4_删除一个字段

sql把两个字段合并到一个字段中_Android中Room的使用4_删除一个字段_第1张图片

Android不能直接删除表中的某个字段,可以通过以下四步实现这个功能。

  1. 创建一个新表,只设定想要的字段

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");
            
        }
    };
}

你可能感兴趣的:(sql把两个字段合并到一个字段中_Android中Room的使用4_删除一个字段)