У меня проблемы с управлением отношениями один-ко-многим между объектами Kotlin, использующими Realm. Я не понимаю, как выполнить вставку или обновление.
Здесь мои два предмета с отношением один-ко-многим между экзаменом и карьерой.
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
}
Здесь два класса диспетчера управляют чтением / записью в области
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
}
}
В моем заявлении мне нужно вставить некоторые экзамены в моей карьере, которые фактически находятся в АКТИВНОМ состоянии. Для вставки я использую CareerManager (). InsertExamInCareer (экзамен) этот вызов (прежде чем я попытаюсь использовать ExamManager (). Insert (экзамен) , но не работает).
Еще один вариант использования - это когда мне нужно закрыть карьеру и добавить экзамен в другую карьеру. Я делаю это таким образом
CareerManager (). CloseActiveCareer ()
CareerManager (). CreateCareer ()
CareerManager (). InsertExamInCareer (экзамен)
Экзамен по двум профессиям одинаков, но они должны были отличаться, и на Экзамене должно быть две записи, а не одна