gpt4 book ai didi

android - Anko 中的简单 MapRowParser 是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:42:17 31 4
gpt4 key购买 nike

我已阅读 Anko SQLite 的文档.

我知道创建一个简单的 RowParser 可以通过执行 val rowParser = classParser<Person>() 来完成。

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

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

最佳答案

如果你在 Github 上做 this search ,您会看到有两个文件以任何方式引用了 MapRowParser。

第一个文件包含以下内容:

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

将 MapRowParser 显示为接口(interface)。

但是。根据搜索,有两个文件提到了 MapRowParser。如果您查看这些文件,您会发现没有类。根据this question它显示了该类的手动实现,它必须手动实现。此外,Anko 的代码没有显示任何实现 MapRowParser 的类。

因此,您必须自己创建一个实现 MapRowParser 的类。如果我正确阅读了文档和代码,则 map 本身会自动传递,但解析器所做的是处理您收到的数据。


与 RowParser 等效。这是一个界面。但是,there is a method that returns a specific parser .不过,RowMapParser 没有这样的东西。

编辑:

进入 the source code表明这两种类型的单行解析器用于几种不同的类型。我认为没有 MapRowParser 的原因是因为编写一个好的通用 map 解析器太难了。 Map 通常具有不同的行为,因为它们具有键和值,而 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
}
}

您可以对 map 执行相同的操作,但 key 会丢失。此外,通过查看源代码,您会发现传入解析器的数据仅包含一列。

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

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
}

如果我已经阅读了源代码,上述方法会将整行转换为单个 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 的类,将数据放入数据类中,无论您使用它做什么。

*写起来太难了,因为你永远无法确定一个开发人员将如何需要这些数据。当您将其作为 map 时,您不能只返回一个值, 因为所有其他数据都会丢失。因此,如果通用解析器需要它,则必须将其作为映射返回,然后开发人员最终仍将不得不解析数据。使用列表很容易只返回一个值。但是对于 Maps,为了不丢失任何数据,如果为标准化目的编写解析器,解析器基本上就变得无用了。

关于android - Anko 中的简单 MapRowParser 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47119025/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com