【问题标题】:Android Room property validate before saving to the database?Android Room 属性在保存到数据库之前验证?
【发布时间】:2021-01-24 05:43:13
【问题描述】:

我有一个实体如下

@Entity
data class User(
    @PrimaryKey 
    var id: String,

    var firstName: String,

    var lastName: String
) 

假设接受的firstNamelastName 是应该严格ASCII的字符串,如何在保存到数据库之前创建验证,或者在保存数据时进行一些预处理?

问题在于有一个验证器来验证数据,而不仅仅是一个 ASCII 检查。

【问题讨论】:

  • 您确定“严格 ASCII”是您要查找的内容吗?字符 0-31 可以吗?
  • @chrylis-cautiouslyoptimistic- 我正在寻找某种验证,不限于数据类型。
  • 进行预处理,我在room中没有验证概念
  • @Sekiro 覆盖保存方法怎么样?有可能吗?

标签: java android validation kotlin android-room


【解决方案1】:

您可以将 Dao 作为一个抽象类,实际保存的是您运行查询的位置,但您从另一个方法调用它。

@Dao
public abstract class UserDao {
    public void insert(User user){
       if(yourCondition){
         insertInternal(user);
       }
    }
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertInternal(User user);
}

【讨论】:

    【解决方案2】:

    验证应该留在服务层而不是数据库层。将工作委托给其他方可能会在将来给您带来麻烦。

    如果您不想在服务层实现它,那么您可以采用不同的方法:确保在字段中始终正确设置值。

    我看到您使用 data class 来表示 @Entity。对我来说,这并不顺利,所以我最终使用了class,因为 JPA 实现使用 getter 和 setter 来处理值,并且字段必须可以为空(也许现在有插件可以完成艰苦的工作) .然后您可以使用委托来确保您的值设置正确。

    private var fistName: String by ascii()
    private var lastName: String by ascii()
    
    fun ascii(): ReadWriteProperty<Any?, String> =
        object : ReadWriteProperty<Any?, String> {
            var curValue: String by Delegates.notNull()
            override fun getValue(thisRef: Any?, property: KProperty<*>): String = curValue
            override fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
                require(isAscii(value)) { "Invalid field value. Ascii required"}
                curValue = value
            }
        }
    
    fun isAscii(value: String) = ...
    

    如果您仍想使用data class,那么您可以使用init 块在构造函数中添加验证。

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多