Использование общих настроек в Android — kotlin

Итак, у меня есть список продуктов, не такой уж большой, это около десяти продуктов (это пример приложения для магазина). Я хочу добавить кнопку, чтобы пользователь мог нажать и добавить товар в корзину. подходят ли общие предпочтения для хранения такого объема данных? Я также знаком с базой данных комнат и знаю, что общие предпочтения предназначены для хранения очень небольшого объема данных. Здесь код:

это мой список:

var list = ArrayList<Model>()
        list.add(Model("milk", "12000", R.drawable.milk))
        list.add(Model("yoghurt", "13000", R.drawable.yoghurt))
        list.add(Model("oil", "15000", R.drawable.oil))
        list.add(Model("canned tomato paste", "8000", R.drawable.tomato_paste))
        list.add(Model("hand wash", "18000", R.drawable.hand_wash))
        list.add(Model("ice cream", "5000", R.drawable.ice_cream))
        list.add(Model("spaggeti", "8000", R.drawable.spaggeti))
        list.add(Model("tomato", "7000", R.drawable.tomato))
        list.add(Model("cucumber", "5000", R.drawable.cucumber))
        list.add(Model("potato", "4000", R.drawable.potato))

Каждая строка имеет всего три значения: заголовок, цена, изображение. с помощью кнопки добавления отправить модель списка в корзину. что-то вроде этого.

btn.add.setonClicklistener {

// store each row that user clicked in the cart using shared preference
}

Это хорошая идея, использующая общие предпочтения для этого случая?


person Bahador Eslami    schedule 28.10.2020    source источник
comment
is it a good Idea using shared preference for this case ? Зависит от проекта (требование)   -  person IntelliJ Amiya    schedule 28.10.2020
comment
это небольшой проект. просто хочу попробовать, если получится.   -  person Bahador Eslami    schedule 28.10.2020
comment
Если вы пытаетесь сделать образец приложения, возможно, так оно и есть. Однако это не было бы хорошей практикой.   -  person Kristy Welsh    schedule 28.10.2020
comment
Простой ответ, вы можете это сделать, это возможно (Сериализация списка массивов), но SharedPreferences не был разработан для этой цели, как вы говорите, вы должны использовать Room.   -  person Bogdan Android    schedule 28.10.2020
comment
спасибо ребята за вашу помощь   -  person Bahador Eslami    schedule 28.10.2020
comment
Пара сотен элементов довольно тривиальна для общих предпочтений. Несколько сотен, и я бы использовал базу данных.   -  person Tenfour04    schedule 28.10.2020


Ответы (2)


Я думаю, это прекрасно. Существует хорошая библиотека, которая может упростить такое использование SharedPreferences, она называется TinyDB. Я использую его сам. Проверьте это: https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo

Вы также можете реализовать это самостоятельно.

person slavko    schedule 28.10.2020

Если бы пользователь мог добавить еду в базу данных, я бы использовал Room, если нет, я бы использовал SharedPreferences для ее хранения.

Добавление комнаты в ваш проект:

build.gradle (проект):

ext {
    roomVersion = '2.2.5'
}

build.gradle (модуль)

apply plugin: 'kotlin-kapt'

build.gradle (модуль)

implementation "androidx.room:room-runtime:$rootProject.roomVersion"
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
kapt "androidx.room:room-compiler:$rootProject.roomVersion"
implementation "androidx.room:room-ktx:$rootProject.roomVersion"
androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"

Еда.kt

@Entity(tableName = "food")
data class Food(
    @PrimaryKey @NonNull val id: Int,
    val name: String,
    val price: String,
    @ColumnInfo(name = "drawable_path") val drawablePath: String) {

    override fun toString(): String {
        return "Food $id: name: $name, price: $price, drawable: $drawablePath"
 }

FoodDao.kt

@Dao
interface FoodDao {

    @Query("SELECT * FROM food WHERE id=:id LIMIT 1")
    fun getFood(id: Int): Food

    @Query("SELECT * FROM food")
    fun getAllFood(): List<Food>

    @Insert
    fun addFood(food: Food)
}

FoodRepository.kt

class FoodRepository(private val foodDao: FoodDao) {

    fun getFood(id: Int) = symptomDao.getFood(id)

    fun getAllFood() = symptomDao.getAllFood()
}

FoodDatabase.kt

@Database(entities = [Food::class], version = 1)
abstract class FoodDatabase : RoomDatabase() {

    abstract fun foodDao(): FoodDao

    companion object {

        @Volatile
        private var INSTANCE: FoodDatabase? = null

        fun getDatabase(context: Context): FoodDatabase? {
            if (INSTANCE == null) {
                synchronized(FoodDatabase::class.java) {
                    if (INSTANCE == null) {
                        INSTANCE = Room.databaseBuilder(
                            context.applicationContext,
                            FoodDatabase::class.java, "food_db"
                        ).build()
                    }
                }
            }
            return INSTANCE
        }
    }
}

Код не тестировался, возможно, вам придется внести небольшие коррективы, чтобы он скомпилировался.

person Oktawian    schedule 28.10.2020
comment
Но разве это не перебор? Он работает над образцом приложения с 10 элементами. - person slavko; 28.10.2020
comment
Я не заметил краткой информации о том, что пользователь не сможет добавить свою еду, вы правы :) - person Oktawian; 28.10.2020