Cómo anotar una columna como NOT NULL utilizando Android Room Persistence Library

Mi class de datos se ve así

@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 ) 

La sala utiliza SQLite y SQLite admite columnas NOT NULL en su database. Traté de anotar columnas con @NonNull, pero no tiene ningún efecto.

¿Hay alguna manera de hacer columnas en la database de la sala que no sea nula?

Para identificar la anotación exacta de NOT NULL, revisé la list de todas las annotations provistas en este enlace: android.arch.persistence.room pero no pude encontrar ninguna anotación relevante:

enter image description here

Mi suposition es que, dado que está utilizando Kotlin, que trata de forma pnetworkingeterminada a una var como no opcional, todos los attributes declarados por usted NO SON NULOS. Para declarar una var como opcional, probablemente tengas que usar a? operador, un ejemplo a continuación:

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

Actualizado basado en comentario:

Supongo que estás confundido con NULL y cadena vacía. NULL significa que no hay ningún valor, en el código compartido está proporcionando un valor pnetworkingeterminado para cada columna que es una cadena vacía y que no es igual a NULL, por lo que aunque no haya proporcionado un valor para ese atributo, se asigna de manera pnetworkingeterminada un string vacía a ella.

Intente eliminar el operador de asignación de valores y el valor de RHS para un atributo y luego inserte el logging sin asignar valor a ese atributo, debe get el error apropiado.

Básicamente, convertir statement a continuación:

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

A

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

Para Java, debe anotar con @ android.support.annotation.NonNull

NO CONFUSE CON @ io.reactivex.annotations.NonNull

Como solución a las restricciones reales de la tabla, puede usar un solo método TypeConverter para asegurarse de que sus miembros String no sean nulos.

Por ejemplo, para una Cadena no nula, podría usar:

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

Puedes simplificarlo así, por supuesto:

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

Y puedes usarlo así:

 @TypeConverters(RoomConverterNullString.class) public String stringMember; 

Las asignaciones y las acciones de actualización / inserción almacenarán un valor de cadena vacío cuando el valor sea nulo y cualquier recuperación forzará la conversión de un valor nulo a una cadena vacía.

Puede hacer esto para otros types y para cualquier valor pnetworkingeterminado que desee tener.

Respuesta complementaria para quienes usan Kotlin:

tenga en count que marcar un tipo como no opcional lo hará automáticamente no nulo (y un tipo opcional no lo hará).

Puede verificarlo en el esquema generado por la sala con @Database(exportSchema = true) en su database.

Por ejemplo, tengo algo así:

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

Y en el esquema generado puedo leer:

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

(Nota: el tipo de date es aquí un Int y el UUID una cadena debido a los convertidores que uso en otro lugar)

  • ¿Cómo unir dos tablas en Android usando el método de consulta del proveedor de contenido?
  • ¿Cómo puedo unirme a tres entidades en GreenDao?
  • Imposible get datos de la database sqlite
  • Agregar / Consultar / Analizar SQLite usando Anko
  • Implementación de SQLite en Kotlin y Anko