如何初始化遵循相同过程的不同Kotlin数据类?

时间:2019-06-14 11:43:55

标签: android oop design-patterns kotlin software-design

我的应用程序中有很多模型,这些模型是数据类。通过我的应用程序(这是一个媒体播放器),我遵循与获取这些类的实例几乎相同的例程。我想使用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查询上的选择参数。

0 个答案:

没有答案