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 (将#修改为@)