【问题标题】: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没有太多经验

【问题讨论】:

    标签: ios swift core-data swift3 realm


    【解决方案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 是的,所以TransactionRecurringTransaction 仍然是完全独立的实体。他们的主键根本不会重叠。除了我所说的之外没有其他限制:它们被视为两个离散的实体。
    • 非常感谢您的帮助。 :)
    • 如果我尝试更改 RecurringTransaction 中的主键,我会收到错误“无法覆盖静态方法”。
    【解决方案2】:

    如果frequency 是可选的,那么单个Transaction 类呢? 如果设置为nil,则为普通事务,如果有值则为循环事务。如果要拆分类,RecurringTransaction 可以是 Transaction 的子类,它只是添加了 frequency 字段。

    【讨论】:

    • 我想将它们分开,因为在付款之前我不会创建交易,如果我想添加一个新属性,它大部分时间都是空的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多