Сохранение разных категорий в Realm, Swift

Я делаю финансовое приложение. Я сохраняю данные с областью, но я не могу понять одну вещь. После того, как пользователь ввел, сколько денег он потратил, он может выбрать категорию: Супермаркет, Транспорт и другие. Итак, вопрос в том, как я могу сохранить данные пользователя по категориям. RealmModel:

class Items: Object {
    @objc dynamic var personID = UUID().uuidString
    @objc dynamic var categoryAmount = ""
    @objc dynamic var categoryName = ""

    override static func primaryKey() -> String? {
        return "personID"
    }  
}
class RealmModel {
    static let shared = RealmModel()
    private let realm = try! Realm()
    let myPrimaryKey = "Primary-Key"

    func addAmount(newItem: String) {
        let categoryAmount = realm.object(ofType: Items.self, forPrimaryKey: myPrimaryKey)
        let new = Items()
        new.personID = "My-Primary-Key"
        new.categoryAmount = newItem
    
        try! realm.write {
            realm.add(new, update: .modified)
        }
    }
    
    func updateAmount(editedItem: Items, newItem: String) {
        try! realm.write {
            editedItem.categoryAmount = newItem
        }
    }
    
    func getAmount() -> Items? {
            let amount = realm.objects(Items.self).last
            return amount
        }
    
    func setAmount(newItem: String) {
        if let data = getAmount() {
            updateAmount(editedItem: data, newItem: newItem)
        } else {
            addAmount(newItem: newItem)
        }
    }
}

Кнопка:

@IBAction func supermarketBTN(_ sender: Any) {
    RealmModel.shared.setAmount(newItem: "\((Double(exileAmount?.categoryAmount ?? "" ) ?? 0) + (Double(self.amountTF.text ?? "") ?? 0))")
    self.exileAmount = RealmModel.shared.getAmount()
    delegate?.updateAmount(amount: self.amountTF.text ?? "")
    dismiss(animated: true, completion: nil)
    
    }

Как мне использовать categoryName для сохранения данных по категориям?


person Artem T    schedule 22.11.2020    source источник


Ответы (1)


Есть 100 различных способов приблизиться к этому. Позвольте мне представить одну возможность на высоком уровне.

Первая проблема заключается в том, чтобы изменить структуру ваших объектов. Вам нужно два; один для хранения пользователя, а другой для хранения выбора категории и потраченной суммы

class UserClass: Object {
   @objc dynamic var userId = "" //however you want to define id's
   @objc dynamic var userName = ""
}

а потом

class SpentMoneyClass: Object {
   @objc dynamic var _id = UUID().uuidString
   @objc dynamic var category = ""
   @objc dynamic var byUserId = ""
   @objc dynamic var amount = 0.0
}

Ваша база данных будет содержать пользователей, и каждый объект пользователя имеет идентификатор пользователя. По мере того, как пользователь тратит деньги, создайте новый класс SpentMoneyClass и заполните свойства — скажем, пользователь Артим тратит деньги на путешествия.

let spend = SpentMoneyClass()
spend.category = "Travel"
spend.byUserId = artimUser.userId
spend.amount = 100.00

записать объект в область

Эта структура позволяет запрашивать все деньги, потраченные Артимом, все деньги, потраченные на путешествия всеми пользователями, и более детальный запрос всех денег, потраченных Артимом на путешествия, или конкретные потраченные суммы. :

let travelTotal: Double = realm.object(SpentMoneyClass.self)
                               .filter("byUserId == x and category == 'Travel'")
                               .sum(ofProperty: "amount")

дает общую сумму, потраченную Артимом на путешествия (x = идентификатор пользователя Artims)

* примечание: я не упомянул первичные ключи и свойства _id, необходимые для MongoDB Realm, чтобы сократить длину

person Jay    schedule 22.11.2020