Kotlin на Android: наведите курсор на список

В Kotlin, Каков наилучший способ итерации через объект Android Cursor и внесение результатов в список?

Моя автоматическая конвертация Java:

val list = ArrayList<String>() while (c.moveToNext()) { list.add(getStringFromCursor(c)) } 

Есть ли более идиоматический способ? В частности, можно ли это сделать в одном присваивании списка только для чтения? Например…

 val list = /*mystery*/.map(getStringFromCursor) 

… или другое расположение, где список назначается полностью сформированным.

Это то, с чем я пошел, в конце, используя kotlin.sequences.generateSequence

 val list = generateSequence { if (c.moveToNext()) c else null } .map { getStringFromCursor(it) } .toList() 

Моя первая попытка была немного короче:

 val list = (1 .. c.count).map { c.moveToNext() getStringFromCursor(c) } 

Обе версии полагаются на курсор, который первоначально помещается перед первой записью. Второй бросал бы, если бы это было не так, в то время как первый вернул бы более короткий список.

Cursor s должен быть ленивым, поэтому нет очевидной map . Однако Anko (ANdroid KOtlin от JetBrains) имеет метод расширения, который поможет вам с отображением Cursor .

Этот метод называется Cursor.parseList(parser) . Здесь вы можете найти полную реализацию. Использование должно быть прямолинейным. И вот некоторые официальные документы по sqlite и синтаксические курсоры с anko.

Ваше первое предложение верно. Вы не можете отображать курсор.