这是处理领域中两个相似对象的正确方法吗?
Posted
技术标签:
【中文标题】这是处理领域中两个相似对象的正确方法吗?【英文标题】:Is this the correct way to handle two similar objects in realm? 【发布时间】:2017-03-05 05:56:45 【问题描述】:我正在开发一个资金跟踪器应用程序,其中有两个不同的对象。一个是“Transaction”,其中包含所有发生的事务,第二个是“RecurringTransaction”,其中包含所有经常性事务。
我使用 Recurring transaction 之类的模板,其中包含创建交易所需的所有信息。我提供了一个清除交易的选项,所以一旦用户清除了经常性交易,那么只有我创建一个交易。我在我的应用中使用 Realm。
这些是对象:
class Transaction: Object
dynamic var id: String = UUID().uuidString
dynamic var title: String = ""
dynamic var amount: Double = 0
dynamic var createdAt: Date = Date()
dynamic var category: Category?
dynamic var recurringTransaction: RecurringTransaction?
dynamic var type: TransactionType = .Income
class RecurringTransaction: Object
dynamic var id: String = UUID().uuidString
dynamic var title: String = ""
dynamic var amount: Double = 0
dynamic var createdAt: Date = Date()
dynamic var category: Category?
dynamic var type: TransactionType = .Income
dynamic var frequency: TransactionFrequency = .Monthly
这是正确的方法吗?如您所见,两者都包含相似的属性,但同时又不同:一个是实际交易,另一个是模板。
还有一个问题,如果我使用 coredata 会有什么不同?因为我对coredata没有太多经验
【问题讨论】:
【参考方案1】:Realm 在一定程度上支持对象的子类化。如果您从另一个Object
子类继承Object
,则子类将包括超类的所有属性以及它自己的属性。这将在数据库中创建两个单独的表,跟踪每种类型。
因此,您不需要有多余的属性名称。这样的事情应该可以工作:
class Transaction: Object
dynamic var id: String = UUID().uuidString
dynamic var title: String = ""
dynamic var amount: Double = 0
dynamic var createdAt: Date = Date()
dynamic var category: Category?
dynamic var recurringTransaction: RecurringTransaction?
dynamic var type: TransactionType = .Income
class RecurringTransaction: Transaction
dynamic var frequency: TransactionFrequency = .Monthly
(完全披露:我为 Realm 工作)如果 Realm 是一个选项并且您在 Core Data 方面没有经验,我不建议您尝试 Core Data。学习曲线和所需的样板代码量并不容易实现。
【讨论】:
谢谢。我有点困惑。还有一个问题,如果我想拥有不同的主键怎么办?现在我对两个模型都有相同的主键,但如果我想改变的话。子类化会带来什么限制? 没问题!如果这回答了您的问题,请随时将答案标记为正确。 :D 是的,所以Transaction
和RecurringTransaction
仍然是完全独立的实体。他们的主键根本不会重叠。除了我所说的之外没有其他限制:它们被视为两个离散的实体。
非常感谢您的帮助。 :)
如果我尝试更改 RecurringTransaction
中的主键,我会收到错误“无法覆盖静态方法”。【参考方案2】:
如果frequency
是可选的,那么单个Transaction
类呢?
如果设置为nil
,则为普通事务,如果有值则为循环事务。如果要拆分类,RecurringTransaction
可以是 Transaction
的子类,它只是添加了 frequency
字段。
【讨论】:
我想将它们分开,因为在付款之前我不会创建交易,如果我想添加一个新属性,它大部分时间都是空的。以上是关于这是处理领域中两个相似对象的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章