Migrasi Basis Data Gagal karena kendala unik di ruangan

Saya mengalami kendala unik di salah satu tabel saya di database lama saya. Saat bermigrasi ke ruangan, saya telah membuat tabel baru sesuai instruksi yang diberikan pada [link] [1] dan menerapkan batasan unik menggunakan kata kunci "indeks" di kelas entitas "TaskDetail". Dan memberikan migrasi kosong. saat menjalankan tes migrasi saya mendapatkan kesalahan terkait batasan unik seperti yang disebutkan di bawah ini. Apa aku melakukan sesuatu yang salah??

Skema Basis Data

String CREATE_TABLE_TASK = "CREATE TABLE IF NOT EXISTS "+TASK+
            " (`task_id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
            "`task_note` TEXT," +
            "`status` INTEGER NOT NULL)";


    String CREATE_TABLE_TASK_DETAIL = "CREATE TABLE IF NOT EXISTS "+TASK_DETAIL+
            " (`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
            "`detail` TEXT NOT NULL UNIQUE)";

Tabel Entitas Ruangan

@Entity(tableName = "task_master")
        public class Task {

            @ColumnInfo(name = "task_id")
            @PrimaryKey(autoGenerate = true)
            @NonNull
            private int taskId;

            @ColumnInfo(name = "task_note")
            private String task;

            private @TaskStatus
            int status;

        }

//TOKEN DETAIL TABLE
@Entity(tableName = "task_detail",indices ={@Index(name = "detail",value = "detail",unique = true)})
    public class TaskDetail {

        @PrimaryKey(autoGenerate = true)
        private int id;

        @NonNull
        private String detail;

    }

kelas RoomDatabase

@Database(entities = {Task.class, TaskDetail.class},version = 2,exportSchema = true)
public abstract class AppDatabase extends RoomDatabase{

    private static final Object sObject = new Object();
    private static AppDatabase sInstance;

    public abstract TaskDao getTaskDao();

    public static AppDatabase getInstance(Context context){

        if(sInstance == null){
            synchronized (sObject){
                if(sInstance == null){
                    sInstance = Room.databaseBuilder(context,AppDatabase.class,"task.db")
                            .allowMainThreadQueries()
                            .build();
                }
            }
        }
        return sInstance;
    }
}

Kesalahan

expacted:TableInfo{name='task_detail', columns={id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, detail=Column{name='detail', type='TEXT', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[Index{name='detail', unique=true, columns=[detail]}]}

found:TableInfo{name='task_detail', columns={id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, detail=Column{name='detail', type='TEXT', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

person Pinakin Kansara    schedule 07.12.2017    source sumber
comment
Ada kesalahan serupa di sini, menggunakan file db yang sama persis, tetapi file saya diharapkan: indeks=[], ditemukan: indeks=null   -  person live-love    schedule 02.01.2018


Jawaban (1)


Anda harus mendefinisikan indeks unix untuk tabel Anda. Untuk task_master jika kunci unik Anda adalah task_id tambahkan sesuatu seperti:

database.execSQL("CREATE UNIQUE INDEX `index_task_master_task_id` ON `task_master` (`task_id`)");

Sama seperti untuk tabel task_detail

person Sara    schedule 05.07.2018