Android Kotlin: царство много к одному - PullRequest
0 голосов
/ 03 ноября 2018

У меня проблемы с управлением отношениями один-ко-многим между объектами 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 (экзамен) Here the result

Экзамен по двум профессиям одинаков, но они должны были отличаться, и на Экзамене должно быть две записи, а не одна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...