2017-10-16 119 views
1

如何將空字段類型遷移到Room中的文本?java.lang.IllegalStateException:遷移未正確處理表

現在我面臨這個問題:

java.lang.IllegalStateException:遷移不能正確處理data_table

預計:TableInfo {名= '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

問題是創建表時,創建者沒有明確指出列。 有兩種方法可以選擇來解決問題。

  1. 您可以在遷移過程中創建一個新數據庫,並將所有舊數據複製到新數據庫中。喜歡這個。

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

但隨着大分貝的工作時,它是低效的。所以我用第二種方法。

2您可以使用您最喜歡的數據庫管理器或終端將表遷移到具有明確列類型的新表中。然後把新的數據庫放到你的項目中。