列类型为布尔值

时间:2019-10-29 10:20:00

标签: android database-migration android-room illegalstateexception

我已经在我的应用程序中实现了Room数据库,其中只有几个表。现在,由于需求已更新,因此我必须在数据库中添加另一个表。我面临的问题是,当我使用列类型布尔型应用程序执行代码时会崩溃。 我的实体类模型如下

@Entity(tableName = Constants.TABLE_NAME_CONVERSATION)
public class ConversationModel {

@PrimaryKey(autoGenerate = true)
private int id;

String inputWord, translatedWord,origin,targetLangCode;
boolean isSpeaking;


public ConversationModel() {
}
}

我写的迁移代码是:

 private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {

        String createTable = "CREATE TABLE IF NOT EXISTS 'conversation' (id  INTEGER NOT NULL PRIMARY KEY, inputWord TEXT, translatedWord TEXT, origin TEXT, targetLangCode TEXT, isSpeaking BOOLEAN)";

        database.execSQL(createTable);
    }
};

我收到的崩溃日志是这样的:

 Caused by: java.lang.IllegalStateException: Migration didn't properly handle conversation(com.translateall.language.free.translator.dictionary.speechtext.learnenglish.models.ConversationModel).
 Expected:
TableInfo{name='conversation', columns={isSpeaking=Column{name='isSpeaking',type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
 Found:
 2019-10-29 13:24:31.433 20525-20525/com.translateall.language.free.translator.dictionary.speechtext.learnenglish E/AndroidRuntime:TableInfo{name='conversation', columns={
  isSpeaking=Column{name='isSpeaking', type='BOOLEAN', affinity='1', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

我的模型类具有布尔类型的项目。为什么要使用整数类型?

1 个答案:

答案 0 :(得分:2)

ROOM仅允许使用TEXT,INTEGER,REAL或BLOB列类型。

您需要使用isSpeaking INTEGER。这将适用于boolean isSpeaking;

所以您应该使用:-

String createTable = "CREATE TABLE IF NOT EXISTS 'conversation' (id  INTEGER NOT NULL PRIMARY KEY, inputWord TEXT, translatedWord TEXT, origin TEXT, targetLangCode TEXT, isSpeaking INTEGER)";

P.S。获取正确的SQL的一种方法是在更改实体后进行编译,然后查看?????? _ impl java的生成的java作为数据库类(其中????是该类)的创建方法。 SQL将在 createAllTables 方法中。