Android应用MongoDB组件崩溃:RLM_ERR_NO_SUCH_TABLE错误排查
崩溃排查求助:Realm数据库查询时提示“无对应表”导致应用崩溃
我已经定位到应用中的目标组件,点击按钮进入对应页面时应用崩溃,以下是相关代码及崩溃栈信息,恳请提供排查建议!
初始化代码
init { viewModelScope.launch(Dispatchers.Main) { MongoDB.getData().collect { data.value = it } } }
获取数据组件代码
override fun getData(): Flow<List<Person>> { return realm.query<Person>().asFlow().map { it.list } }
崩溃栈信息
FATAL EXCEPTION: main Process: com.example.groundzero, PID: 15617 java.lang.ExceptionInInitializerError at com.example.groundzero.mongodb.mongohomescreen.HomeViewModel$1.invokeSuspend(HomeViewModel.kt:27) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@43b8bcc, Dispatchers.Main] Caused by: java.lang.IllegalArgumentException: [RLM_ERR_NO_SUCH_TABLE]: No such table exists at io.realm.kotlin.internal.interop.CoreErrorConverter.asThrowable(CoreErrorConverter.kt:42) at io.realm.kotlin.internal.interop.realmcJNI.realm_get_class(Native Method) at io.realm.kotlin.internal.interop.realmc.realm_get_class(realmc.java:558) at io.realm.kotlin.internal.interop.RealmInterop.realm_get_class-nILuwFE(RealmInterop.kt:304) at io.realm.kotlin.internal.schema.CachedSchemaMetadata.<init>(CachedClassKeyMap.kt:101) at io.realm.kotlin.internal.LiveRealmReference.<init>(RealmReference.kt:108) at io.realm.kotlin.internal.ConfigurationImpl.openRealm$suspendImpl(ConfigurationImpl.kt:108) at io.realm.kotlin.internal.ConfigurationImpl.openRealm(Unknown Source:0) at io.realm.kotlin.mongodb.internal.SyncConfigurationImpl.openRealm(SyncConfigurationImpl.kt:114) at io.realm.kotlin.internal.RealmImpl$1.invokeSuspend(RealmImpl.kt:107) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:280) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59) at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1) at io.realm.kotlin.internal.platform.CoroutineUtilsSharedJvmKt.runBlocking(CoroutineUtilsSharedJvm.kt:22) at io.realm.kotlin.internal.platform.CoroutineUtilsSharedJvmKt.runBlocking$default(CoroutineUtilsSharedJvm.kt:21) at io.realm.kotlin.internal.RealmImpl.<init>(RealmImpl.kt:106) at io.realm.kotlin.internal.RealmImpl.<init>(Unknown Source:0) at io.realm.kotlin.internal.RealmImpl$Companion.create$io_realm_kotlin_library(RealmImpl.kt:263) at io.realm.kotlin.Realm$Companion.open(Realm.kt:82) at com.example.groundzero.mongodb.data.MongoDB.configureTheRealm(MongoDB.kt:40) at com.example.groundzero.mongodb.data.MongoDB.<clinit>(MongoDB.kt:26) ... 11 more
排查建议
- 检查Schema配置:确认
Person实体类是否被正确纳入Realm的schema。如果用自动schema,确保Person类添加了@RealmClass注解,且Realm初始化时的配置包含该类。 - 数据库版本与迁移:如果是版本更新后出现问题,检查
configureTheRealm()里的数据库版本号,确认是否添加了对应迁移逻辑,让Realm能正确创建Person对应的表结构。 - 初始化时机验证:崩溃发生在
MongoDB的静态初始化块中,检查Realm实例的初始化是否在合适时机执行,避免在未完成初始化前发起查询。 - 实体类定义检查:确认
Person类符合Realm要求,比如字段不能是final(主键字段除外),且正确继承RealmObject或使用EmbeddedRealmObject(嵌入对象场景)。 - 清理测试环境:开发环境下,尝试清理应用数据或重装应用,排除旧数据库文件损坏导致的表缺失问题。
内容的提问来源于stack exchange,提问作者Josef M
相关产品推荐
相关产品推荐

