ios - 使用 Realm、Swift 保存不同的类别
问题描述
我正在做一个金融应用程序。我正在使用领域保存数据,但我无法理解一件事。用户输入后,他花了多少钱,他可以选择一个类别:超市,运输等。所以问题是我如何按类别保存用户的数据。领域模型:
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 按类别保存数据?
解决方案
有 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
}
您的数据库将包含用户,并且每个用户对象都有一个 userId。当用户花钱时,创建一个新的 SpentMoneyClass 并填写属性 - 假设用户 Artim 在 Travel 上花钱
let spend = SpentMoneyClass()
spend.category = "Travel"
spend.byUserId = artimUser.userId
spend.amount = 100.00
将对象写入领域
这种结构使您能够查询 Artim 花费的所有金额、所有用户花费的所有旅行费用,以及更精细地查询 Artim 花费的所有旅行费用或特定金额 - 您可以利用聚合函数 .sum 轻松获得总计:
let travelTotal: Double = realm.object(SpentMoneyClass.self)
.filter("byUserId == x and category == 'Travel'")
.sum(ofProperty: "amount")
给出 Artim 在旅行上的总花费(x = Artim 用户 ID)
*注意我省略了 MongoDB Realm 所需的主键和 _id 属性以保持长度较短
推荐阅读
- python - scipy.optimize.leastsq 和 scipy.optimize.least_squares 之间的区别?
- iframe - Chrome 仅在某些网站上强制在框架上使用白色背景
- hadoop - 如何解决 job_1634335400729_0001 failed with state FAILED 由于:Application application_1634335400729_0001 failed 2 times error on hadoop
- mvvm - Android Kotlin ApiService,Okhttp - 数据未收到
- regex - 正则表达式仅匹配具有环视功能的特定列
- excel - 在大量工作表中搜索数据,如果在 VBA 中找到数据,则将整行复制到单独的工作表中
- ios - Apple ID 登录。致命错误:在展开可选值时意外发现 nil
- javascript - Discord JS - 从另一个文件的方法导入变量
- c++ - 有没有办法转发声明std :: thread?
- java - 如果尚未搜索城市,则刷新面板将永远重新加载