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

 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.

enter image description here

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?

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>() 
  • Cómo anotar una columna como NOT NULL utilizando Android Room Persistence Library
  • No se puede acceder a BaseColumns proporciona la propiedad _ID en Kotlin
  • Causado por: android.database.sqlite.SQLiteException: cerca de "org": error de syntax (código 1):, al comstackr:
  • IlegalStateException donde se lanzó, al intentar recuperar los valores de la instancia de RoomDatabase
  • Kotlin Closable y SQLiteDatabase en Android