如何在Kotlin中将旧数据保存到数据类中

时间:2019-06-04 19:00:45

标签: android kotlin data-class

我正在尝试使用数据类,但无法弄清楚如何正确保存数据。

我创建了一个数据类:

  data class SavedValue( var currentValue:String, var previousValue:String = "")

我想要的是每次我想要保存一个新的currentValue时,已经保存的current的值将被复制到previousValue中,而新的currentValue会覆盖currentValue字段。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

Kotlin中的数据类不应提供此类功能,因为它们旨在保存数据。
您可以只使用一个简单的类。
尽管如此,您可以实现所需的内容(使用或不使用数据类),但是您必须在类内移动currentValue并使用设置器(和获取器)。
替换为private之类的_currentValue属性:

data class SavedValue(private var _currentValue: String, var previousValue: String = "") {
    var currentValue: String
        get() = _currentValue
        set(value) {
            previousValue = _currentValue
            _currentValue = value
        }
}

此代码:

val sv = SavedValue("abc")
println("currentValue = ${sv.currentValue} and previousValue = ${sv.previousValue}")

将打印:

currentValue = abc and previousValue = 

这:

sv.currentValue = "ABC"
println("currentValue = ${sv.currentValue} and previousValue = ${sv.previousValue}")

将打印:

currentValue = ABC and previousValue = abc

此外,我认为您需要previousValue作为只读属性,对吗?
因此,也将其移到类中,并使其设置为private

data class SavedValue(private var _currentValue: String) {
    var _previousValue: String = ""

    var currentValue: String
        get() = _currentValue
        set(value) {
            previousValue = _currentValue
            _currentValue = value
        }

    var previousValue: String
        get() = _previousValue
        private set(value) {
            _previousValue = value
        }
}

答案 1 :(得分:0)

要使用数据类来实现目标并非一帆风顺。相反,您可以使用POJO类并使用自定义的setter和getter。

class SavedValue(currentValue: String, previousValue: String) {
private var _currentValue: String = currentValue
private var _previousValue: String = previousValue

var currentValue: String
    get() {
        return _currentValue
    }
    set(value) {
        _previousValue = _currentValue
        _currentValue = value
    }

   override fun toString(): String {
       return "SavedValue(_currentValue='$_currentValue', 
      _previousValue='$_previousValue')"
   }
}

答案 2 :(得分:0)

第一个解决方案效果很好,但是如果您不希望第三个字段仅保留当前值,则可以执行以下操作:

/Items/Item/Name

例如

data class SavedValue(var previousValue: String = "") {
    var currentValue: String = ""
        set(value) {
            if (field != value) previousValue = field
            field = value
        }
}

输出:

val savedValue = SavedValue()
savedValue.currentValue = "initial value"
println("current: ${savedValue.currentValue} - previous: ${savedValue.previousValue}")
savedValue.currentValue = "second value"
println("current: ${savedValue.currentValue} - previous: ${savedValue.previousValue}")
savedValue.currentValue = "third value"
println("current: ${savedValue.currentValue} - previous: ${savedValue.previousValue}")

或者,如果您想使用非可变的previousValue,则需要第三个字段:

I/System.out: current: initial value - previous:
I/System.out: current: second value - previous: initial value
I/System.out: current: third value - previous: second value