在Realm数据库中创建然后更新现有元素的问题

时间:2018-07-02 14:36:03

标签: swift database realm

我有一个领域数据库,该数据库由Year-> Month-> Day-> Items

组成

箭头从父类别转到子类别。 我能够保存一次计算,但是如果再次执行该计算,则会抛出一个错误:主键0的月份已经存在。我确实知道它存在的原因,这就是为什么我希望Realm更新它。我想每个月只保存一次,每年只保存一次。

//MARK: - Realm Database Saving option
@objc func saveCalculation(){
    let date = Date()
    let dateElements = getDate()

    let yearObject = Year()
    yearObject.number = dateElements.year

    let monthObject = Month()
    monthObject.number = dateElements.month
    monthObject.monthName = dateElements.monthName

    let dayObject = Day()
    dayObject.id = realm.objects(Day.self).count
    dayObject.date = date
    dayObject.number = dateElements.day
    dayObject.dayName = dateElements.dayNameInWeek
    dayObject.hoursPerDay = hoursPerDay
    dayObject.ratePerHour = ratePerHour
    dayObject.minutesOfNormalPay = minutesOfNormalPay
    dayObject.earnedPerDay = earnedPerDay
    dayObject.howManyRows = rowViews.count

    do {
        try realm.write {
            realm.add(yearObject, update: true)
            yearObject.months.append(monthObject)
            realm.add(monthObject, update: true)
            monthObject.days.append(dayObject)
            realm.add(dayObject, update: false)

            for (index, row) in rowViews.enumerated() {
                let item = Item()
                item.id = index
                item.date = date
                item.amount = Double(row.amountTextField.text!) ?? 0.0
                item.price = Double(row.priceTextField.text!) ?? 0.0
                print("Item amount: \(item.amount) and price: \(item.price)")
                dayObject.items.append(item)
                realm.add(item)
            }
        }
    } catch {
        print(error.localizedDescription)
    }



}

func getDate() -> (day: Int, dayNameInWeek: String, month: Int, monthName: String, year: Int) {
    let date = Date()
    let dayNameInWeek = date.getDayName()
    let monthName = date.getMonthName()

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day], from: date)

    let year =  components.year!
    let month = components.month!
    let day = components.day!

    print(year)
    print(month)
    print(monthName)
    print(day)
    print(dayNameInWeek)
    return (day,dayNameInWeek, month, monthName, year)
}

每个数据库类分别为:

import Foundation
import RealmSwift

class Year: Object {
    //@objc dynamic var year = Date()
    @objc dynamic var id: Int = 0
    @objc dynamic var number: Int = 2008
    let months = List<Month>() //forward relationship to Months

    override class func primaryKey() -> String {
        return "id"
    }
}

月份:

import Foundation
import RealmSwift

class Month: Object {
@objc dynamic var id: Int = 0
@objc dynamic var number: Int = 0
@objc dynamic var monthName: String = ""
@objc dynamic var monthYear: Int = 0
let days = List<Day>() //forward relationship to Days
let parentYear = LinkingObjects(fromType: Year.self, property: "months") //back relationship to year

override class func primaryKey() -> String {
    return "id"
 }
}

日期:

import Foundation
import RealmSwift

class Day: Object {
    @objc dynamic var id: Int = 0
    @objc dynamic var date: Date = Date()
    @objc dynamic var number: Int = 0
    @objc dynamic var dayName: String = ""
    @objc dynamic var hoursPerDay: Double = 0.0
    @objc dynamic var ratePerHour: Double = 0.0
    @objc dynamic var minutesOfNormalPay: Double = 0.0
    @objc dynamic var earnedPerDay: Double = 0.0
    @objc dynamic var howManyRows: Int = 0
    let items = List<Item>() //forward relationship to Items
    let parentMonth = LinkingObjects(fromType: Month.self, property: "days") //back relationship to months

    override class func primaryKey() -> String {
        return "id"
    }
}

项目:

import Foundation
import RealmSwift

class Item: Object {
    @objc dynamic var id: Int = 0
    @objc dynamic var date: Date = Date()
    @objc dynamic var amount: Double = 0.0
    @objc dynamic var price: Double = 0.0

    let parentDay = LinkingObjects(fromType: Day.self, property: "items") //back relationship to days
}

1 个答案:

答案 0 :(得分:0)

我设法用其他条件解决了这个问题。如果有人知道更简洁的编写方式,请张贴在下面,因为我真的很想缩短这段代码。

//MARK: - Realm Database Saving option
@objc func saveCalculation(){
    let date = Date()
    let dateElements = getDate()
    var isParentYear = false
    var isParentMonth = false

    let yearObject: Year
    if let currentYearObject = realm.objects(Year.self).first(where: {$0.number == dateElements.year}) {
        yearObject = currentYearObject
        isParentYear = true
    } else {
        yearObject = Year()
        yearObject.id = realm.objects(Year.self).count
        yearObject.number = dateElements.year
    }

    let monthObject: Month
    if let currentMonthObject = realm.objects(Month.self).first(where: {$0.monthYear == dateElements.year && $0.number == dateElements.month}) {
        monthObject = currentMonthObject
        isParentMonth = true
    } else {
        monthObject = Month()
        monthObject.id = realm.objects(Month.self).count
        monthObject.number = dateElements.month
        monthObject.monthYear = dateElements.year
        monthObject.monthName = dateElements.monthName
    }


    let dayObject = Day()
    dayObject.id = realm.objects(Day.self).count
    dayObject.date = date
    dayObject.number = dateElements.day
    dayObject.dayName = dateElements.dayNameInWeek
    dayObject.hoursPerDay = hoursPerDay
    dayObject.ratePerHour = ratePerHour
    dayObject.minutesOfNormalPay = minutesOfNormalPay
    dayObject.earnedPerDay = earnedPerDay
    dayObject.howManyRows = rowViews.count

    do {
        try realm.write {
            if isParentYear && isParentMonth{
                print("Parent Year is: \(isParentYear) and parent Month is: \(isParentMonth)")
                monthObject.days.append(dayObject)
                realm.add(dayObject, update: false)
            } else if isParentYear && !isParentMonth {
                print("Parent Year is: \(isParentYear) and parent Month is: \(isParentMonth)")
                yearObject.months.append(monthObject)
                realm.add(monthObject, update: true)
                monthObject.days.append(dayObject)
                realm.add(dayObject, update: false)
            } else if !isParentYear && !isParentMonth {
                print("Parent Year is: \(isParentYear) and parent Month is: \(isParentMonth)")

                realm.add(yearObject, update: true)
                yearObject.months.append(monthObject)
                realm.add(monthObject, update: true)
                monthObject.days.append(dayObject)
                realm.add(dayObject, update: false)
            } else {
                print("THISH SHOULD NEVER BE CALLED IF CALLED SOMETHING IS VERY WRONG")
            }

            for (index, row) in rowViews.enumerated() {
                let item = Item()
                item.id = index
                item.date = date
                item.amount = Double(row.amountTextField.text!) ?? 0.0
                item.price = Double(row.priceTextField.text!) ?? 0.0
                print("Item amount: \(item.amount) and price: \(item.price)")
                dayObject.items.append(item)
                realm.add(item)
            }
        }
    } catch {
        print(error.localizedDescription)
    }     
}