Hel*_*oCW 7 android kotlin anko
我已经阅读了Anko SQLite的文档.
我知道创建一个简单的RowParser可以通过这样做来完成 val rowParser = classParser<Person>()
classParser是Anko-SQLite源代码中定义的函数.
我怎么能得到一个简单的MapRowParser?
如果你继续使用Github进行搜索,你会看到有两个文件以任何方式引用MapRowParser.
第一个文件包含:
interface MapRowParser<out T> {
fun parseRow(columns: Map<String, Any?>): T
}
Run Code Online (Sandbox Code Playgroud)
其中显示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
}
}
Run Code Online (Sandbox Code Playgroud)
您可以对地图执行相同操作,但密钥会丢失.此外,通过检查源代码,您会看到传递给解析器的数据只包含一列.
进一步深入挖掘源代码也揭示了这种方法:
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
}
Run Code Online (Sandbox Code Playgroud)
如果我已经正确读取了源代码,则上述方法将整行转换为单个Map,并使用该列的名称.所以你最终得到这样的东西:
Col1 -> Row1col1val
Col2 -> Row1col2val
...
Run Code Online (Sandbox Code Playgroud)
系统在游标上运行,可以在解析List或Map中的多个条目的方法中看到:
moveToFirst()
while (!isAfterLast) {
list.add(parser.parseRow(readColumnsMap(this)))//adds the result into a pre-defined list to return
moveToNext()
}
Run Code Online (Sandbox Code Playgroud)
这再次显示出,编写一个通用的是硬的,因为必须有一个返回值是有道理的,这是很难做到的,如果你不知道把什么样的数据到一个单一的返回值.
这对于编写通用解析器来说太难了,因为你永远无法确定行的数量,要对值做什么等等.因此,为了编写自己的解析器,你需要创建一个实现MapRowParser并使用它来解析所需数据的类.通过将ID分配给存储为blob的类,将数据放入数据类中,无论您使用什么,都可以实例化.
*写起来太难了,因为你无法确定一个开发人员将如何需要这些数据.当您将其作为地图时,您不能只返回单个值,因为所有其他数据都将丢失.因此,如果需要一般的解析器,则必须将其作为映射返回,然后开发人员仍然必须解析数据.通过列表,只需返回单个值即可.但是对于Maps,为了不丢失任何数据,如果为了标准化目的而编写解析器,则解析器基本上变得无用.
| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |