如何自定义逻辑验证以在Android Room中插入实体

我有一个这样的实体:

data class Person(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,@ColumnInfo(name = "user_id",index = true) var userId: Long = 0,@ColumnInfo(name = "first_name") var firstName: String = "",@ColumnInfo(name = "mid_name") var midName: String = "",@ColumnInfo(name = "last_name") var lastName: String = ""
) {
    public fun fullName(): String {
        return "$firstName $midName $lastName"
    }
}

我知道我可以为每个命名属性设置“ not null”属性。但就我而言,不需要填写所有名称属性,我只想在该实体保存到会议室数据库之前验证全名是否为空

我正在练习使用MVVM框架,但是现在我不确定应该将验证放在哪里。活动/片段? ViewModel?仓库?还是直接在实体内部?

我认为也许应该在存储库中执行此操作,以便在将输入保存到数据库之前可以防止输入错误。但是,如果还有另一个用例需要在不同的存储库中验证同一事物,该怎么办?如果是这样,那么该代码将被复制到两个存储库中。

我曾经在ruby上编写过ruby,模型中有验证功能,如下所示:

# This is ruby on rails code
validate :name_validation

def name_validation
    if first_name == "" && mid_name == "" && last_name == ""
        errors.add(:name,"the name should not be totally blank")
    end
end

我想知道是否有类似的方法可以验证实体中的属性,或者有更好的方法来解决此问题?

请帮我弄清楚。

sunshengxia 回答:如何自定义逻辑验证以在Android Room中插入实体

我认为也许我们可以直接使用fullName属性,并使其不为空。

然后创建 Name类用于名称处理,并创建 NameConveter类用于转换。

因此示例代码可能看起来像这样:

class Name(
    var firstName: String = "",var midName: String = "",var lastName: String = ""
) {
    public fun fullName(): String {
        return "$firstName $midName $lastName".trim()
    }
}

@Entity
data class Person(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,@ColumnInfo(name = "user_id",index = true) var userId: Long = 0,@ColumnInfo(name = "full_name") var fullName: Name
)

class DateConverter {
    @TypeConverter
    fun fromTimestamp(value: String): Name {
        val nameStr = value.split(" ")
        return Name(nameStr[0],nameStr[1],nameStr[2])
    }

    @TypeConverter
    fun dateToTimestamp(name: Name): String? {
        val fullName = name.fullName()
        // Here is the trick 
        // to make a blank full name become an invalid name for a not null property
        if (name.isNullOrBlank()) {
            return null
        } else {
            return fullName
        }
    }
}

这样我们就可以通过 Name Class 来访问多个名称,数据库将帮助我们现在检查全名。

我知道我的示例代码可能会引起一些问题,例如名称字符串中的多余空白字符,但是现在让我们集中讨论fullName验证问题。

我今天想出了这个解决方案,不确定是否是一个好的答案。

我在这里张贴文章,供所有人评判。

本文链接:https://www.f2er.com/3153425.html

大家都在问