如何解决Realm 不保存请求,并且没有 @PrimaryKey 的 RealmObject 无法更新
这是我第一次遇到这样的问题,我还没有想出如何解决它。如果你突然知道了什么,请帮助我。
错误:
A RealmObject with no @PrimaryKey cannot be updated: class com.example.logic.domain.MovingRequest}
它是如何使用的:
视图模型
launch {
interactor.movetoFolder(request)
}
launch 来自 kotlinx.coroutines Builders.common.kt
Inrecactor
suspend fun movetoFolder(request: Request): Result<Unit,Error> {
return try {
Result.Success(repository.movetoFolder(request))
} catch (throwable: Throwable) {
Result.Fail(Error.MovetoFolderError)
}
}
存储库
override suspend fun movetoFolder(request: Request) {
db.createMovingRequest(request)
}
override fun createMovingRequest(request: Request) {
Realm.getDefaultInstance().use {
try {
it.executeTransaction { realm ->
val requests = realm.where<MovingRequest>().findFirst() ?: MovingRequest()
requests.requestList.add(0,MovingToFolderRequest(request.postId,request.folderId))
realm.copyToRealmOrUpdate(requests)
}
} catch (e: Exception) {
Log.d("NewResult","createMovingRequest() error: ${e.message}}")
}
}
}
如果我继续使用 it.executeTransaction
,它会导致 catch 块中先前评论的异常。
但是,如果我将其更改为 it.executeTransactionAsync
,则会引发以下堆栈跟踪错误:
2021-04-14 17:36:55.081 19534-19534/com.example.android E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android,PID: 19534
io.realm.exceptions.RealmException: Async transaction Failed
at io.realm.Realm$1$2.run(Realm.java:1657)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.IllegalArgumentException: A RealmObject with no @PrimaryKey cannot be updated: class com.example.logic.domain.folders.move.MovingRequest
at io.realm.Realm.checkHasPrimaryKey(Realm.java:1729)
at io.realm.Realm.copyToRealmOrUpdate(Realm.java:1090)
at com.example.logic.local.db.realm.DatabaseImplRealm$createMovingRequest$$inlined$use$lambda$1.execute(DatabaseImpl.kt:446)
at io.realm.Realm$1.run(Realm.java:1601)
at io.realm.internal.async.BgPriorityRunnable.run(BgPriorityRunnable.java:34)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
但是当我用
替换上面存储库级别的实现时override suspend fun movetoFolder(request: Request) = withContext(dispatchers.IO) {
db.createMovingRequest(request)
}
并将 it.executeTransaction
更改为 it.executeTransactionAsync
错误消失了。
但是因为我无法在领域数据库中保存请求 - 写入数据库就不会发生。
你能帮我吗?实施有什么问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。