У меня в приложении куча моделей, которые являются классами данных.Через мое приложение (которое является медиаплеером) я выполняю почти ту же процедуру для получения экземпляров этих классов. Я хочу запросить базу данных (которая здесь называется 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 при вызове конструктора класса для создания новых экземпляров.