Anko中简单的MapRowParser是什么?

我已经阅读了Anko SQLite的文档。

我知道创建一个简单的RowParser可以通过做val rowParser = classParser<Person>()

classParser是Anko-SQLite源代码中定义的一个函数。

我怎样才能得到一个简单的MapRowParser

如果你在Github上进行搜索 ,你会发现有两个文件以任何方式引用MapRowParser。

第一个文件包含这个:

 interface MapRowParser<out T> { fun parseRow(columns: Map<String, Any?>): T } 

其中显示了MapRowParser作为一个接口。

然而。 根据搜索有两个文件提到MapRowParser。 如果你仔细查看这些文件,你会发现没有类。 根据这个显示类的手动实现的问题 ,必须手动实现。 另外,Anko的代码没有显示任何实现MapRowParser的类。

所以,你必须创建一个自己实现MapRowParser的类。 如果我已经阅读了文档和代码,映射本身是自动传递的,但解析器所处理的是处理您收到的数据。


等同于RowParser。 这是一个接口。 但是, 有一种方法返回一个特定的分析器 。 尽管如此,RowMapParser并没有这样的功能。

编辑:

进入源代码显示,这两种类型的单行解析器用于几种不同的类型。 我认为没有MapRowParser的原因是编写一个好的,一般的地图解析器太困难了。 地图具有不同的行为,因为它们有一个键和一个值,而一个List只有一个值,可以作为一个类型返回:

 private class SingleColumnParser<out T> : RowParser<T> { override fun parseRow(columns: Array<Any?>): T { if (columns.size != 1) throw SQLiteException("Invalid row: row for SingleColumnParser must contain exactly one column") @Suppress("UNCHECKED_CAST") return columns[0] as T//Right here it just casts the column as the type defined when creating } } 

你可以用地图做同样的事情,但是关键会丢失。 另外,通过检查源代码,你会发现传递给解析器的数据只包含一列。

进一步挖掘源代码还揭示了这种方法:

 private fun readColumnsMap(cursor: Cursor): Map<String, Any?> { val count = cursor.columnCount val map = hashMapOf<String, Any?>() for (i in 0..(count - 1)) { map.put(cursor.getColumnName(i), cursor.getColumnValue(i)) } return map } 

如果我已经读取了源的权利,上面的方法将整个行转换为一个单一的地图,并与它的列的名称。 所以你最终得到这样的一行:

 Col1 -> Row1col1val Col2 -> Row1col2val ... 

系统在游标上运行,这可以在解析List或Map中的多个条目的方法中看到:

 moveToFirst() while (!isAfterLast) { list.add(parser.parseRow(readColumnsMap(this)))//adds the result into a pre-defined list to return moveToNext() } 

这又一次表明,编写一个泛型是很难的,因为必须有一个有意义的返回值,如果你不知道把什么样的数据放入一个返回值是很难做到的。

这太难了*要编写一个通用的解析器,因为你永远无法确定行的数量,值是怎么做的等等。所以为了编写你自己的解析器,你创建一个这个类实现了MapRowParser,并用它来解析你所需要的数据。 通过将一个实例的ID分配给一个存储为blob的类,把这些数据放到一个数据类中,无论用于什么目的。

*编写起来太难了,因为你永远无法确定一个开发人员将如何需要这些数据。 当你把它作为一个地图,你不能只返回一个单一的值,因为所有其他的数据将会丢失。 所以如果需要一个普通的解析器,那么你必须把它作为一个映射返回,然后开发人员最终还是不得不解析数据。 使用列表很容易只返回一个值。 但是,为了不丢失任何数据,使用地图时,如果为了标准化的目的而编写解析器,那么这个解析器就变得毫无用处了。