android - Android Kotlin:领域多对一关系
问题描述
我在使用 Realm 管理 Kotlin 对象之间的一对多关系时遇到了麻烦。我不明白如何进行一些插入或更新。
这里我的两个对象与考试和职业之间存在一对多的关系。
open class Career : RealmObject() {
@PrimaryKey
var id: Long = 1
var status: String = CareerStatus.ACTIVE.value
var careerName: String? = null
var exams: RealmList<Exam>? = null
}
open class Exam : RealmObject() {
@PrimaryKey
var id: Long = 1
var teachers: String? = null
var lode: Boolean? = null
var score: String = ""
var exam: String = ""
var examDescription: String? = null
var date: Date = Date()
var cfu: Long = Long.MIN_VALUE
@LinkingObjects("exams")
val career: RealmResults<Career>? = null
}
这里的两个类 Manager 管理 Realm 上的读/写
class CareerManager : DatabaseManager() {
fun findActiveCareer(): Career? {
return realm.where(Career::class.java).equalTo("status", CareerStatus.ACTIVE.value).findFirst()
}
fun insertExamInCareer(exam: Exam) {
realm.executeTransaction {
var activeCareer: Career = findActiveCareer()
?: throw Resources.NotFoundException("No active career found")
activeCareer.exams?.add(exam)
realm.copyToRealmOrUpdate(exam)
}
}
fun closeActiveCareer() {
realm.executeTransaction {
val activeCareer: Career = findActiveCareer()
?: throw Resources.NotFoundException("No active career found")
activeCareer.status = CareerStatus.TERMINATED.value
}
}
}
class ExamManager : DatabaseManager() {
fun findAll(): List<Exam> {
val findAll = realm.where(Exam::class.java).findAll()
return realm.copyFromRealm(findAll).toList()
}
fun findAllActive(): List<Exam> {
val findAll = realm.where(Exam::class.java).equalTo("career.status", CareerStatus.ACTIVE.value).findAll()
return realm.copyFromRealm(findAll).toList()
}
fun insert(exam: Exam): Long {
realm.beginTransaction()
var newId: Long = 1
if (realm.where(Exam::class.java).max("id") != null) {
newId = realm.where(Exam::class.java).max("id") as Long + 2
}
val examToSave = realm.createObject(Exam::class.java, newId)
examToSave.exam = exam.exam
examToSave.examDescription = exam.examDescription
examToSave.date = exam.date
examToSave.teachers = exam.teachers
examToSave.score = exam.score
examToSave.lode = exam.lode
examToSave.cfu = exam.cfu
realm.commitTransaction()
CareerManager().updateCareerExam(findAll())
return newId
}
}
在我的应用程序中,我需要在我的职业生涯中插入一些实际上处于 ACTIVE 状态的考试。对于插入,我使用CareerManager().insertExamInCareer(exam)这个调用(在我尝试使用ExamManager().insert(exam)但不起作用之前)。
另一个用例是当我需要关闭一个职业并将考试添加到另一个职业时。我以这种方式这样做
CareerManager().closeActiveCareer()
CareerManager().createCareer()
CareerManager().insertExamInCareer(考试)
两个职业的考试是一样的,但他们必须不同,在考试中必须有两个记录,而不是一个
解决方案
推荐阅读
- c - 我尝试创建以相反顺序显示其给定参数的代码,但为什么它的代码告诉我分段错误?
- sql - TSQL Outer JOIN:SELECT 附近的语法不正确
- mysql - 表DB自动填充
- geoip - Matomo 中的 GeoIP,之前的 Piwik 地图东京区
- objective-c - 如何在 LZip 的 NSTask 参数中传递源和目标路径?
- php - 如何在 php 中调用表 AVG()
- python - 监控文件夹中添加的 .jpg,使用 CUPS 自动打印,将相同的 .jpg 移动到另一个文件夹
- javascript - 为什么我的幻灯片在我的 React 应用程序中不起作用?
- javascript - React Redux:与示例 A 代码完美配合,但在示例 B 代码中返回调度错误
- python - 地图地形分析:numpy.roll 函数的替代方案?