Как инициализировать разные классы данных Kotlin, которые следуют той же процедуре? - PullRequest
0 голосов
/ 14 июня 2019

У меня в приложении куча моделей, которые являются классами данных.Через мое приложение (которое является медиаплеером) я выполняю почти ту же процедуру для получения экземпляров этих классов. Я хочу запросить базу данных (которая здесь называется MediaStore), используя проекцию для Songs / Albums / Artists, и я хочусоздать экземпляры и добавить их в список, который будет служить моей библиотекой.

То, что я сделал до сих пор для создания списка песен, выглядит следующим образом:

val SONG_SEARCH_PROJ = hashMapOf<String, String>(
"id" to MediaStore.Audio.AudioColumns._ID,
"title" to MediaStore.Audio.AudioColumns.TITLE,
"album" to MediaStore.Audio.AudioColumns.ALBUM,
"album id" to MediaStore.Audio.AudioColumns.ALBUM_ID,
"artist" to MediaStore.Audio.AudioColumns.ARTIST,
"artist id" to MediaStore.Audio.AudioColumns.ARTIST_ID,
"data" to MediaStore.Audio.AudioColumns.DATA)



var songLibrary: () -> ArrayList<SongModel> = {
    var songsList = ArrayList<SongModel>()
    val cursor = context.contentResolver.query(
        uri,
        SONG_SEARCH_PROJ.values.toTypedArray(), selection, null, sortOrder
    )
    cursor?.let { current_cursor ->
        while (!current_cursor.isAfterLast) {
            SONG_SEARCH_PROJ.apply {
                songsList.add(
                    SongModel(
                        current_cursor.getData("id", this).toInt(),
                        current_cursor.getData("title", this),
                        current_cursor.getData("data", this),
                        current_cursor.getData("artist", this),
                        current_cursor.getData("album", this),
                        null
                    )
                )
            }
            current_cursor.moveToNext()
        }
        cursor.close()
    }
    songsList
}

Также для лучшей читабельности я создал функцию расширения для класса Cursor, который получает хэш-карту и строку, которая будет служить ключом.

fun Cursor.getData(key: String, hashmap: HashMap<String, String>): String{
    return this.getString(this.getColumnIndex(hashmap[key]))
}

Мои классы данных также следующие:

@Entity
data class SongModel(
    @PrimaryKey val id: Int,
    val name: String,
    val Location: String,
    val ArtistName: String,
    val AlbumName: String,
    val ArtWorkLocation:String?)

======

data class AlbumModel(@PrimaryKey val name: String, val artistName: String, val songList: ArrayList<SongModel>)

======

data class ArtistModel(@PrimaryKey val Name: String, var albumList: ArrayList<AlbumModel>)

=====

В данный момент моя проблема в том, что я не могу сгенерировать функцию "createLibraryOf_X_Model", так как Kotlin не принимает создание экземпляра универсальных типов.Я также наткнулся на заводской шаблон, но мне было трудно приспособить его к моей текущей проблеме.

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

Моя текущая проблема заключается в том, что, учитывая, что логика запросов к базе данных и создания экземпляров практически одинакова, вполне логично ожидать, что каким-то образом генерируется функция «Поколение библиотеки», в результате чего я передамМодель класса и параметры запроса к функции, и он создаст библиотеку соответственно.В настоящее время я использую разные методы генерации для каждой из моих библиотек, и единственное различие между ними заключается в аргументах выбора в запросах MediaStore при вызове конструктора класса для создания новых экземпляров.

...