简体   繁体   English

如何通过 id 从房间数据库中获取特定值?

[英]How to get specific value from room database by id?

I have a simple room database with LiveData, i want to get (cartPriceI: Double) values by id to use it within specific methods.我有一个带有 LiveData 的简单房间数据库,我想通过 id 获取 (cartPriceI: Double) 值以在特定方法中使用它。

CartItemsDatabase.kt购物车商品数据库.kt

@Parcelize
@Entity(tableName = "cart_table")
data class CartItemsDatabase(
    @PrimaryKey(autoGenerate = true) var cid: Int,
    @ColumnInfo(name = "titleD") var cartTitle: String?,
    @ColumnInfo(name = "imageD") var cartImage: Bitmap?,
    @ColumnInfo(name = "priceLD") var cartPriceL: Double?,
    @ColumnInfo(name = "priceID") var cartPriceI: Double?,
    @ColumnInfo(name = "itemNumD") var cartNum: Int?,
    @ColumnInfo(name = "descriptionD") var cartDes: String?): Parcelable

CartItemsDAO.kt购物车商品DAO.kt

@Dao
interface CartItemsDAO {

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun addItem(cartItemsDatabase: CartItemsDatabase)

    @Update
    suspend fun updateCart(cartItemsDatabase: CartItemsDatabase)

    @Query("SELECT * FROM cart_table ORDER BY cid ASC")
    fun readAllData(): LiveData<List<CartItemsDatabase>>

    @Delete
    fun delete(cartItems: CartItemsDatabase)
}

CartRepository.kt CartRepository.kt

class CartRepository(private val cartItemsDAO: CartItemsDAO) {
    val readAllData: LiveData<List<CartItemsDatabase>> = cartItemsDAO.readAllData()
    suspend fun addItem(cartItemsDatabase: CartItemsDatabase){
        cartItemsDAO.addItem(cartItemsDatabase)
    }
    suspend fun updateCart(cartItemsDatabase: CartItemsDatabase){
        cartItemsDAO.updateCart(cartItemsDatabase)
    }
}

CartViewModel.kt CartViewModel.kt

class CartViewModel(application: Application): AndroidViewModel(application) {
    val readAllData: LiveData<List<CartItemsDatabase>>
    private val repository: CartRepository

    init {
        val cartDao = AppDatabase.getDatabase(application).cartDao()
        repository = CartRepository(cartDao)
        readAllData = repository.readAllData
    }
    fun addItem(cartItemsDatabase: CartItemsDatabase){
        viewModelScope.launch(Dispatchers.IO){
            repository.addItem(cartItemsDatabase)
        }
    }
    fun updateCart(cartItemsDatabase: CartItemsDatabase){
        viewModelScope.launch(Dispatchers.IO) {
            repository.updateCart(cartItemsDatabase)
        }
    }
}

AppDatabase.kt AppDatabase.kt

@Database(entities = [CartItemsDatabase::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
    abstract fun cartDao(): CartItemsDAO
    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            // if the INSTANCE is not null, then return it,
            // if it is, then create the database
            val tempInstance = INSTANCE
            if (tempInstance != null){
                return tempInstance
            }
            synchronized(this){
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "cart_database"
                ).build()
                INSTANCE = instance
                return instance
            }
        }

        private fun buildDatabase(context: Context): AppDatabase {
            return Room.databaseBuilder(
                context.applicationContext,
                AppDatabase::class.java,
                "cartItems_database"
            )
                .build()
        }
    }
}

I'm a beginner, i want to know if there is possible way to do that and retrieve specific values from database (ex. cartPriceI in Double) by id!我是初学者,我想知道是否有可能通过 id 从数据库(例如 Double 中的 cartPriceI)中检索特定值!

You can query the database by the given id and return it asynchronously either with a suspend fun or LiveData/Flow您可以通过给定的id查询数据库并使用 suspend fun 或 LiveData/Flow 异步返回它

In the CartItemsDAO :CartItemsDAO

@Query("SELECT cartPriceI FROM cart_table WHERE cid = :id")
suspend fun getPrice(id: Int): Double


@Query("SELECT cartPriceI FROM cart_table WHERE cid = :id")
fun getPrice(id: Int): LiveData<Double>

You can get a specific model by SELECT with WHERE statement你可以通过WHERE语句通过SELECT得到一个特定的 model

@Query("SELECT * FROM cart_table WHERE cid == : cid")
fun getCartItemsDatabase(cid: String): LiveData<CartItemsDatabase?>

Or you can Return a subset of a table's columns或者您可以返回表列的子集

@Query("SELECT priceID FROM cart_table WHERE cid == : cid")
fun getCartItemPrice(cid: String): LiveData<Double>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM