Как настроить логическую проверку для вставки сущностей в комнате Android - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть сущность, подобная этой:

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"
    }
}

Я знаю, что могу установить атрибут "не нуль" для каждого именованного свойства. Но в моем случае нет необходимости заполнять все свойства имени, Я хочу только подтвердить, что полное имя пустое или нет , прежде чем этот объект будет сохранен в базе данных комнаты.

IЯ практикую использовать фреймворк MVVM, но сейчас я не уверен, куда мне поставить валидацию. Деятельность / Фрагмент? ViewModel? Repository? или внутри сущности напрямую?

Я думаю, может быть, мне следует сделать это в репозитории, чтобы я мог предотвратить неправильный ввод, прежде чем сохранить его в базе данных. Но что, если есть другой вариант использования, который мне нужен, чтобы проверить ту же вещь в другом хранилище? Если это так, то код будет продублирован в двух репозиториях.

Я когда-либо писал 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

Интересно,Есть аналогичный способ проверки свойства в сущности, или есть лучшая практика для решения этой проблемы?

Пожалуйста, помогите мне разобраться.

1 Ответ

0 голосов
/ 14 ноября 2019

Я думаю, что, может быть, мы можем просто использовать свойство fullName напрямую и позволить ему не иметь значение null.

Затем создать Класс имен для обработки имен и Класс 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
        }
    }
}

Так что мы можем получить доступ к нескольким именам по Имя класса , и база данных поможетнам нужно проверить полное имя сейчас.

Я знаю, что мой пример кода может вызвать некоторую проблему, такую ​​как дополнительный пустой символ в строке имени, но давайте пока сосредоточимся на проблеме проверки полного имени.

Я разобрался с этим решением сегодня, я не уверен, что это хороший ответ или нет.

Я пишу здесь и открыт для всех, чтобы судить о нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...