问题描述
我正在尝试预填充一个数据库,但我生成了插入数据 当我运行该应用程序时,它会出现此构建错误:
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))
}
}