Intereting Posts
неразрешенная ссылка: запуск Как я могу получить ценность от наблюдаемых Как получить последнее значение, исходящее из наблюдаемого Расширение Kotlin Android не может разрешить «текст», Преобразованный файл класса java в kotlin делает ошибку компиляции «Ошибка: не удалось найти или загрузить основной« ИЛИ »класс не найден» – с помощью андроидного модуля (Gradle / IntelliJ) Инициализировать ArrayList <ArrayList <Int >> с размером в kotlin Сканер Bluetooth Low Energy работает нормально, но не находит никаких устройств Является ли идиоматичным всегда предпочтение свойствам над полями поддержки? Преобразование статических переменных из Java в Kotlin Есть ли способ сделать виджет ViewPager DecorView с содержимым фрагмента? Где / Как вы добавляете документацию для пакетов Kotlin? Есть ли простой способ получить объект by _id в Котлине? Синхронный вызов Android Retrofit 2 Как мое преобразование из String в Double не работает?

Как комментировать столбцы как NOT NULL с помощью библиотеки сохранения пространства Android

Мой класс данных выглядит так

@Entity(tableName = "items") data class Item( @ColumnInfo(name = "name") var name: String = "", @ColumnInfo(name = "room") var room: String = "", @ColumnInfo(name = "quantity") var quantity: String = "", @ColumnInfo(name = "description") var description: String = "", @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") var id: Long = 0 ) 

Комната использует SQLite, а SQLite поддерживает NOT NULL столбцы в своей базе данных. Я попытался аннотировать столбцы с @NonNull, но это не повлияло.

Есть ли способ сделать столбцы в базе данных номеров недействительными?

Solutions Collecting From Web of "Как комментировать столбцы как NOT NULL с помощью библиотеки сохранения пространства Android"

Чтобы определить точную аннотацию для NOT NULL, я просмотрел список всех аннотаций, представленных по этой ссылке: android.arch.persistence.room, но не смог найти соответствующую аннотацию:

введите описание изображения здесь

Мое предположение заключается в том, что, поскольку вы используете Kotlin, который по умолчанию рассматривает var как необязательный, все объявленные вами атрибуты NOT NULL. Чтобы объявить var как необязательный, вы должны использовать? оператора, пример ниже:

 var name: String // NOT NULL var name: String? // OPTIONAL 

Обновлено на основе комментария:

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

Попробуйте удалить оператор присвоения значений и значение RHS для атрибута, а затем вставить запись, не присваивая значение этому атрибуту, вы должны получить соответствующую ошибку.

В основном, конвертировать ниже заявление:

 @ColumnInfo(name = "name") var name: String = "" 

к

 @ColumnInfo(name = "name") var name: String 

Для Java вы должны аннотироваться с @ android.support.annotation.NonNull

НЕ СОХРАНЯЙТЕ С @ io.reactivex.nnotes.NonNull

Как работа с фактическими ограничениями таблицы, вы можете использовать один класс TypeConverter, чтобы убедиться, что ваши члены String не равны нулю.

Например, для Non-null String вы можете использовать:

 public class RoomConverterNullString { @TypeConverter public static String fromNullToString(String value) { if (value == null) { return ""; } else { return value; } } } 

Конечно, вы можете упростить это:

 public class RoomConverterNullString { @TypeConverter public static String fromNullToString(String value) { return (value == null) ? "" : value; } } 

И вы можете использовать его так:

 @TypeConverters(RoomConverterNullString.class) public String stringMember; 

Любые назначения и действия по обновлению / вставке будут хранить пустое строковое значение, когда значение равно null, и любое извлечение заставит нулевое значение быть преобразованным в пустую строку.

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

Дополнительный ответ для тех, кто использует Котлин:

обратите внимание, что маркировка типа как необязательного будет автоматически сделать его не нулевым (и необязательный тип этого не сделает).

Вы можете проверить его в схеме, сгенерированной комнатой, с помощью @Database(exportSchema = true) в вашей базе данных.

Например, у меня есть что-то вроде этого:

 @Entity(tableName = "messages") data class Message ( @PrimaryKey val messageId: UUID = UUID.randomUUID(), val date: Date = Date(), val receivedDate: Date? = null ) 

А в сгенерированной схеме я могу читать:

 "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` ( `messageId` TEXT NOT NULL, `date` INTEGER NOT NULL, `receivedDate` INTEGER, PRIMARY KEY(`messageId`) )" 

(Примечание: тип даты здесь Int и UUID – строка из-за конвертеров, которые я использую в другом месте)