Объявление проекции в Loader в Котлине - PullRequest
0 голосов
/ 20 октября 2018

Я взялся за изучение kotlin, поэтому решил написать простое приложение, использующее RecyclerView в сочетании с базой данных с поставщиками контента.В настоящее время я застрял в MainActivity в методе onCreateLoader.В Java я обычно объявлял проекцию следующим образом:

String[] projection  = {
        WalletEntry._ID,
        WalletEntry.KEY_TITLE,
        WalletEntry.KEY_MONEY,
        WalletEntry.KEY_LAST_DATE,
        WalletEntry.KEY_LAST_EXPENSE,
        WalletEntry.KEY_LAST_TRANSACTION_TITLE
    };

, который работал нормально.Но в kotlin, когда я пытаюсь определить проекцию подобным образом, я получаю ошибку при возврате этого:

val projection  = arrayOf({
            WalletEntry._ID
            WalletEntry.KEY_TITLE
            WalletEntry.KEY_MONEY
            WalletEntry.KEY_LAST_DATE
            WalletEntry.KEY_LAST_EXPENSE
            WalletEntry.KEY_LAST_TRANSACTION_TITLE
        })

        return applicationContext?.let { context ->
            CursorLoader(context,
                    WalletEntry.CONTENT_URI,
                    projection,
                    null,
                    null,
                    null)
        }!!

Это дает мне ошибку, говорящую: Требуется несоответствие типов: Array <(out) String!>?found: Array <() -> String> и, если честно, понятия не имею, как это исправить.Я видел в некоторых исходных кодах, что люди просто используют имя таблицы вместо вызова класса Contract и его записи, но я нахожу это немного запутанным при изменении имени таблицы.

Кстати, между запятыми нетИмена таблиц AS находит как неожиданный токен

Итак, как мне отформатировать проекцию, чтобы исправить ошибку?

1 Ответ

0 голосов
/ 20 октября 2018

Когда вы заключаете список полей в {}, kotlin интерпретирует его как тело «функции», возвращаемое значение будет последней строкой, поэтому тип kotlin founds:

Array<() -> String> // An array of functions with no parameters that returns strings

Так что когдавы создаете массив, вы создаете массив «функций», когда требуемый тип для CursorLoader равен

Array<(out) String!>? //A nullable array of strings

Как сказал @rciovati, просто удалите {}, и вы получите правильный тип дляCursorLoader ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...