- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我已阅读 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/
我使用 Anko DSL 制作了这个警报,并且没有在分辨率较低的设备上显示。 dialog = alert { customView {
我正试图接触 Anko 并遇到了这个问题。在其文档中说 Anko 有一个 convenience methods for logging ,我试过了,但 Android Studio 不会自动导入它,
有没有办法使用 Anko 将主题和样式添加到布局中?谢谢 最佳答案 我只是谷歌了同样的问题,并找到了答案 here 主题 Anko 也支持通过在任何 View 或布局之前的 themed 前缀来覆盖
我正在显示带有消息和确定按钮的警报对话框。但是确定按钮的颜色和按钮的文本是相同的 context!!.alert ("this test message for the dialog aleat"){
有了 Anko,我可以写这样的东西来显示对话框: alert("Dialog title") { yesButton {} noButton {} }.show() 如何为按钮设置标题?
在 anko/kotlin 中做 horizontalLayout 的好方法是什么? verticalLayout 工作正常 - 可以在其上设置方向,但感觉不对。不知道我在那里缺少什么。 最佳答案
GitHub 仓库链接:https://github.com/mattn/anko 1. anko 是干嘛用的? anko 是一个可以让 Go 项目支持脚本语言的小工具。换句话说,就是我们可以给
当在 Anko 的警报生成器中使用 positiveButton 和 negativeButton 时,即使 dismiss() ,它们似乎都会导致关闭对话框不被调用。有什么方法可以在单击按钮后保持对
我有这个问题: 错误: C:\Users\avi12\OneDrive\Documents\AndroidApps\WhatsApp Easy Sticker Maker\app\src\main\j
我对android开发完全陌生,所以我几天前才安装了Android studio。我创建了一个支持 Kotlin 的新项目和一个空 Activity ,并想使用 anko 库创建一个对话框。 我的 M
我正在使用 anko bg 功能来管理后台任务。 代码如下 import com.github.kittinunf.fuel.core.FuelError import com.github.kitt
我创建了一个自定义样式: wrap_content wrap_content 5dp 然后我用静态函数扩展了anko: inline fun ViewManager.sta
关注this slightly outdated tutorial之后,我一直在尝试使用 org.jetbrains.anko.design.floatingActionButton。错误是: Can
我正在 Android Studio 中创建一个项目,并且正在使用 Anko 库在单独的线程上运行 API 请求。所述线程只是进行 HTTP GET 调用并解析数据,同时 UI 线程传递所述数据并启动
使用 Anko,可以很容易地访问之前定义的组件。例如: verticalLayout { val name = editText() button("Say Hello") {
Anko Commons - Intent Usage 我如何准确地将 RecyclerView Adapter/else 中 Anko Commons 的 Intent 用于新的 Activity?
我是 anko 和协程的新手,所以如果我问一些琐碎的事情,请原谅 :) 所以我想要做的是让用户点击一个按钮,然后我想从互联网上下载一个 JSON,将它存储在本地并解析它。由于这两个操作都需要相当长的时
我正在尝试使用 anko 在警报中添加微调器。到目前为止,我的代码如下所示: alert(getString(R.string.alert)) { positiveButton
我正在尝试使用 Anko Commons – Logging 但出于某种原因,详细信息和调试信息没有显示在 logcat 上 但是,当我使用 Log.d 时,它按预期工作。 当我尝试这段代码时 ver
我正在使用 Anko DSL 编写 Android 布局。在定义 TextView 时,我想让它居中对齐,所以我这样写: verticalLayout { textView(R.string.
我是一名优秀的程序员,十分优秀!