0

Androidで古いsqliteからRoomへの移行を行っているときに、 "INTEGER NOT NULL"を使用してコンパイルする必要があります。 マイグレーション中にNULLフィールドを「NOT NULL」パラメータで新しいテーブルに挿入するとエラーが発生するAndroid room migration nullエラー

android.database.sqlite.SQLiteConstraintException:NOT NULL制約に失敗しました:note.notification_state (コード1299)

編集:

11-29 22:52:58.891 14605-14630/com.aleksandarvasilevski.notes E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1 
                      Process: com.aleksandarvasilevski.notes, PID: 14605 
                      java.lang.IllegalStateException: Migration didn't properly handle note(com.aleksandarvasilevski.notes.repository.db.Note). 
                      Expected: 
                      TableInfo{name='note', columns={notification_date=Column{name='notification_date', type='TEXT', notNull=false, primaryKeyPosition=0}, priority=Column{name='priority', type='INTEGER', notNull=true, primaryKeyPosition=0}, description=Column{name='description', type='TEXT', notNull=false, primaryKeyPosition=0}, title=Column{name='title', type='TEXT', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, notification_state=Column{name='notification_state', type='INTEGER', notNull=true, primaryKeyPosition=0}, created_date=Column{name='created_date', type='TEXT', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]} 
                      Found: 
                      TableInfo{name='note', columns={notification_date=Column{name='notification_date', type='TEXT', notNull=false, primaryKeyPosition=0}, priority=Column{name='priority', type='INTEGER', notNull=false, primaryKeyPosition=0}, title=Column{name='title', type='TEXT', notNull=false, primaryKeyPosition=0}, description=Column{name='description', type='TEXT', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, notification_state=Column{name='notification_state', type='INTEGER', notNull=false, primaryKeyPosition=0}, created_date=Column{name='created_date', type='TEXT', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]} 
                       at com.aleksandarvasilevski.notes.repository.db.NoteDatabase_Impl$1.validateMigration(NoteDatabase_Impl.java:70) 
                       at android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:75) 
                       at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:118) 
                       at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256) 
                       at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
                       at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:93) 
                       at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54) 
                       at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:193) 
                       at com.aleksandarvasilevski.notes.repository.db.NoteDao_Impl$5.compute(NoteDao_Impl.java:195) 
                       at com.aleksandarvasilevski.notes.repository.db.NoteDao_Impl$5.compute(NoteDao_Impl.java:181) 
                       at android.arch.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:87) 
                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                       at java.lang.Thread.run(Thread.java:761) 

コード:

`@database(エンティティ= {Note.class}、バージョン= 3) パブリック抽象クラスNoteDatabase RoomDatabaseを拡張{

public static final Migration MIGRATION_2_3 = new Migration(2, 3) { 
    @Override 
    public void migrate(@NonNull SupportSQLiteDatabase database) { 

     database.execSQL(
       "CREATE TABLE note (id INTEGER NOT NULL, title TEXT, description TEXT, created_date TEXT, notification_date TEXT, notification_state INTEGER, priority INTEGER, PRIMARY KEY(id))"); 


     database.execSQL(
       "INSERT INTO note (id, title, description, created_date) SELECT _ID, title, description, date FROM notes"); 

    } 
};` 
+0

を拡張し、あなたが 'INTEGER NOT NULL'をしたい場合は、その列に' null'なので値を保存することができません。それは部屋特有のものではありません。既存のデータベースでその列に 'null'値が許されている場合は、' NOT NULL'にしたり、既存の 'null'値に対してどのような変換をしたいのかを判断したりしないでください。 – CommonsWare

+0

問題は、整数がNOT NULLでなければならないか、コンパイル時エラーです。 –

+0

質問を編集して、コンパイル時のエラーとそのエラーを生成するコードを示す[mcve]を投稿してください。 – CommonsWare

答えて

0

[OK]を、私は誰もが同じ問題を抱えている場合は、それだけで使い、作業ましNOT NULL DEFAULT 0(または他の数)。

@Database(entities = {Note.class}, version = 3) 

パブリック抽象クラスNoteDatabaseはRoomDatabase {

public static final Migration MIGRATION_2_3 = new Migration(2, 3) { 
    @Override 
    public void migrate(@NonNull SupportSQLiteDatabase database) { 

     database.execSQL(
       "CREATE TABLE note (id INTEGER NOT NULL, title TEXT, description TEXT, created_date TEXT, notification_date TEXT, notification_state INTEGER NOT NULL DEFAULT 0, priority INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(id))"); 

     database.execSQL(
       "INSERT INTO note (id, title, description, created_date) SELECT _ID, title, description, date FROM notes"); 

    } 
}; 
関連する問題