将 3000 行插入房间数据库但方法太大

问题描述

我正在尝试预填充一个数据库,但我生成了插入数据 当我运行该应用程序时,它会出现此构建错误

Caused by: org.jetbrains.org.objectweb.asm.MethodTooLargeException: Method too large:

我有一个这样的功能

RoomDatabase.Callback(){

    override fun onCreate(db: SupportsqliteDatabase) {
        super.onCreate(db)
        
        val pDao = database.get().pDao()
        val pLangDao = database.get().pLangDao()

        applicationScope.launch {
            
            insertPWithPLangEnglish_1_10(pDao,pLangDao)
           
        }

    }
}


private suspend fun insertPWithPLangEnglish_1_10(pDao: PDao,pLangDao: PLangDao){
    var insId = pDao.insert(P(pcId = 1))
    pLangDao.insert(PLang(pItemId = insId.toInt(),title = "herbert",locale = "en_US",langCode = "en"))
    insId = pDao.insert(P(pcId = 1))
    pLangDao.insert(PLang(pItemId = insId.toInt(),title = "others",langCode = "en"))
    
    ... and so on about 3000 more lines
}

知道如何解决这个问题吗?

P类如下:

@Entity(tableName = "p")
@Parcelize
data class P (
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "pid")
    val pId: Int = 0,@ColumnInfo(name = "pc_id")
    val pcId: Int,val created: Long = System.currentTimeMillis()

) : Parcelable {
}

PLang 类如下:

@Entity(tableName = "p_lang")
@Parcelize
data class PLang (
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "p_lang_id")
    val pLangId: Int = 0,@ColumnInfo(name = "p_item_id")
    val pItemId: Int,val locale: String = "",@ColumnInfo(name = "lang_code")
    val langCode: String,val title: String,val description: String = ""

) : Parcelable {

}

现在我在 Workers 的帮助下尝试另一种方法,以及来自 json 文件的种子数据库

解决方法

很明显,Kotlin 编译器在抱怨,因为您的方法太长,您应该对其进行优化。

为此,您可以创建一个包含所有 PLang 对象的全局列表:

val pLangList = listOf(
    PLang(title = "herbert",locale = "en_US",langCode = "en"),PLang(title = "others",...
)

请注意,我没有设置 pItemId 属性,实际上,您还应该更改您的 PLang 类,为方便起见为其分配一个默认值:

@Entity(tableName = "p_lang")
@Parcelize
data class PLang (
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "p_lang_id")
    val pLangId: Int = 0,@ColumnInfo(name = "p_item_id")
    val pItemId: Int = -1,// <--- Added default value here
    val locale: String = "",@ColumnInfo(name = "lang_code")
    val langCode: String,val title: String,val description: String = ""

) : Parcelable {

}

现在您可以遍历列表并添加每个项目,只需 3 行代码而不是 ~3000 行:

private suspend fun insertPWithPLangEnglish_1_10(pDao: PDao,pLangDao: PLangDao)
{
    for (pLang in pLangList) 
    {
        val insId = pDao.insert(P(pcId = 1))
        pLangDao.insert(PLang(pItemId = insId.toInt(),title = pLang.title,locale = pLang.locale,langCode = pLang.langCode))
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...