Escriba desajuste. Mapa obligatorio <String, Any> Found Map <String, Any?>
Estoy tratando de ejecutar select utilizando la extensión anko
en kotlin
como a continuación
fun read() { database.use { select(PersonTable.Name).exec { select("myTable").exec() { parseList( object : MapRowParser<Map<String, Any>> { override fun parseRow(columns: Map<String, Any?>): Map<String, Any> { Log.d("Hello", "Hello") return columns; } } ) } } } }
Recibo un error en la return column
- Error de la database de la sala Android: parámetro no utilizado: días en la function @Query
- Imposible get datos de la database sqlite
- Android (Kotlin): sobrescribe el nombre para la input del logging de llamadas
- ¿Cómo unir dos tablas en Android usando el método de consulta del proveedor de contenido?
- Por qué las entidades Room no funcionan con properties inmutables en Android
Type mismatch. Requinetworking Map<String, Any> Found Map<String, Any?>
Si cambio para override fun parseRow(columns: Map<String, Any>): Map<String, Any>
entonces muestra un error.
build.gradle
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.williams.fourthdemo" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile 'com.android.support:appcompat-v7:25.3.1' testCompile 'junit:junit:4.12' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile "org.jetbrains.anko:anko-common:0.10.1" compile "org.jetbrains.anko:anko-sqlite:0.10.1" }
¿Este error está en la biblioteca anko?
- Error al hacer que Enum sea la key principal en la biblioteca de la database de la sala
- Cómo pasar el nombre de db en time de ejecución en kotlin
- Agregar / Consultar / Analizar SQLite usando Anko
- Seleccionar datos de dos tablas en Kotlin Anko
- Implementación de SQLite en Kotlin y Anko
- Tipo de interferencia fallida. No coinciden los types esperados: requiere un par de cadenas encontrado <String, String> en Kotlin y Anko
- ¿Cómo puedo unirme a tres entidades en GreenDao?
- Base de datos de android de Kotlin: no se puede convertir java.lang.String en android.database.Cursor
Parece
object : MapRowParser<Map<String, Any>> {
debería ser realmente
object : MapRowParser<Map<String, Any?>> {
Es muy común que las bases de datos tengan columnas que devuelvan un valor nulo en la celda. La forma en que la definiste como Any
significa nulo nunca va a suceder. Si emite su retorno a un Map<String, Any>
, simplemente terminará con errores de time de ejecución que suceden si un nulo está contenido en algún lugar.
Usted es el más adecuado haciéndolo un Any?
tipo que fuerza al tipo de retorno parseRow a ser Map<String, Any?>
también y corrige el posible error en su código que ocurriría si un valor nulo se arrastrara hacia alguna parte.
columns
tienen el tipo Map<String, Any?>
, note que Any?
es cualquier object o null
. Pero el tipo de devolución del método es Map<String, Any>
, Any
no puede ser nulo.
Por ejemplo, puede filtrar el map entrante, dejando solo valores no nulos: columns.filterValues { it != null } as Map<String, Any>
. Contiene un elenco sin marcar, pero es seguro.
No es un error en Anko. Es un error en tu código.
Esta function es incorrecta:
override fun parseRow(columns: Map<String, Any?>): Map<String, Any> { Log.d("Hello", "Hello") return columns; }
Estás tomando una input y devolviéndola como está, pero con un tipo diferente.
Su input es de tipo Map<String, Any?>
Pero tiene que transformarla de alguna manera en Map<String, Any>
Sería como si definieras una function que toma String y devuelve Int así:
fun parseString(s: String): Int { return s }
Obviamente, esto no se comstackrá.
La interfaz que intentas implementar es básicamente:
interface MapRowParser<out T> { fun parseRow(columns: Map<String, Any?>): T }
Se supone que debes proporcionar una function que convierta un dictionary que represente una fila de database a un object concreto de tu elección. Pero tienes que proporcionar código para hacer el procesamiento.
Alternativamente, Anko le proporciona una function que puede asociar automágicamente una fila de la tabla a un constructor de la class, que es lo que preferiría usar, en lugar de hacer una asignación manual de las keys del dictionary a los campos de la class.
data class User(val userId: Int, val userName: String) val rowParser = classParser<User>()