代码之家  ›  专栏  ›  技术社区  ›  AD Progress

创建和更新领域数据库中的现有元素时出现问题

  •  0
  • AD Progress  · 技术社区  · 7 年前

    我有一个领域数据库,其中包含年-月-日-项

    箭头从父类别转到子类别。 我可以保存计算一次,但如果我再次保存,它将在主键0的当月抛出一个错误。我知道它存在什么,这就是我想要领域更新它的原因。因为我想每个月只存一次,每年只存一次。

    //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 回复  |  直到 7 年前
        1
  •  0
  •   AD Progress    7 年前

    我已经设法用其他一些条件来解决这个问题。如果有人知道一种更简单的编写方法,请将其发布在下面,因为我真的对缩短代码很感兴趣。

    //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)
        }     
    }