我的应用程序中有很多模型,这些模型是数据类。通过我的应用程序(这是一个媒体播放器),我遵循与获取这些类的实例几乎相同的例程。我想使用Songs / Albums / Artists的投影查询数据库(这里是MediaStore),并且我想要创建实例并将其追加到列表中,该列表将作为我的库。
到目前为止,我为创建歌曲列表所做的工作如下:
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>)
=====
我的问题是,由于Kotlin不接受创建泛型类型的实例,因此我目前无法泛化“ createLibraryOf_X_Model”函数。我也偶然发现了工厂模式,但是很难适应当前的问题。
编辑:我在这里没有很好地解释我的问题,所以我改写了上一段。
我当前的问题是,考虑到数据库查询和创建实例的逻辑几乎相同,期望以某种方式通用化“库生成”功能是相当合乎逻辑的,这将导致我传递模型类以及该函数的查询参数,它将相应地创建该库。我现在所做的是每个库都有不同的生成方法,它们之间的唯一区别是在调用类的构造函数以创建新实例时,MediaStore查询上的选择参数。