2017-10-16 8 views
1

空のフィールドタイプをRoomのテキストにどのように移行しますか?java.lang.IllegalStateException:マイグレーションがテーブルを正しく処理していない

はjava.lang.IllegalStateException:TableInfo {名= 'data_table'、列= URL:移行が正常にdata_table

期待を処理していませんでした

は、今のところ私はこの問題に直面しています=列{名= 'URL'、タイプ= 'TEXT'、notNullを=偽、 primaryKeyPosition = 0} .....見つかり

:TableInfo {名= 'data_table'、列= URL =列{name = 'url'、 タイプ= ''、notNullを=偽、primaryKeyPosition = 0} .....

私は未定義typeAffinityを使用して試してみたが、それは効果がありません。

+0

'@ Entity' POJOには何がありますか?ルームは本当にタイプが好きで、私は「未定義」を試していません - ここでタイプを避けようとしている特別な理由はありますか? – CommonsWare

+0

POJOフィールドは文字列です。データ型なしで列を作成した従来のコードがあります。 –

+0

Roomへのプレルームデータベースの移行は、このようなことになります。最初に手動でマイグレーションを行う以外に、Roomの申込みを始める前に、これに対処する方法がわかりません。 – CommonsWare

答えて

0

問題は、テーブルを作成するときに作成者が列を明示的に示していないことです。 問題を解決する方法は2通りあります。

  1. 移行中に新しいDBを作成し、すべての古いデータを新しいものにコピーすることができます。このような。

    static final Migration MIGRATION_1_2 = new Migration(1, 2) { 
        @Override 
        public void migrate(SupportSQLiteDatabase database) { 
         // Create the new table 
         database.execSQL(
           "CREATE TABLE data_table_new (url TEXT"); 
         // Copy the data 
         database.execSQL(
           "INSERT INTO data_table_new url SELECT url FROM data_table"); 
         // Remove the old table 
         database.execSQL("DROP TABLE data_table"); 
         // Change the table name to the correct one 
         database.execSQL("ALTER TABLE data_table_new RENAME TO data_table"); 
        } 
    }; 
    

しかし、大規模なDBを操作する場合には、非効率的です。だから私は2番目の方法を使用します。

2好きなdbマネージャまたはターミナルで明示的な列タイプの新しいテーブルにテーブルを移行します。次に、あなたのプロジェクトに新しいdbを入れてください。

関連する問題