如何在 Kotlin 中使用房间数据库检索活动之间的数据

问题描述 投票:0回答:0

当我从 API 发送数据然后使用

Room Database
将数据存储回应用程序时,我遇到了一个小问题。为什么我这样做是因为我正在开发一个类似电子商务的应用程序,可以将产品存储在购物车中。我使用
Room Database
从我在我的项目中使用
Volley Library
检索的 API 实现了购物车。但是,当购物车数据试图从 API 检索数据时,我实际上遇到了一个问题,我将数据保存在
companion object
中,但是当它到达
Cart Activity
时,只有image 数据匹配,而产品 nameprice 没有出现,只显示我在 XML 布局中提供的默认文本。

在这里我附加了

ModelProduct
类,它是购物车功能的模型类

@Entity (tableName = "cart")
class ModelProduct(@PrimaryKey(autoGenerate = true)
                   @ColumnInfo(name = "idTbl")
                   var idTbl: Int,
                   var id: Int,
                   var name: String,
                   var price: Int,
                   var merk: String,
                   var stock: Int,
                   var catProduct: String,
                   var image: String,
                   var description: String,
                   var quantity: Int,
                   var created_at: String,
                   var updated_at: String,
                   var selected: Boolean = true)

来自模型类,我将所有数据存储在

GlobalData
类中

class GlobalData {

    companion object{

        var ids: Int = 0
        var nameProduct: String = String()
        var priceProduct: Int = 0
        var merkProduct: String = String()
        var stockProduct: Int = 0
        var imageProduct: String = String()
        var descProduct: String = String()

      }
}

然后global类的数据居然已经成功入库了,当所有的信息都出现在

DetailProductActivity
类的时候我才看到这个

class DetailProductActivity : AppCompatActivity() {

    lateinit var cartDB: CartDB
    lateinit var cartItem: ModelProduct
    @SuppressLint("SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_detail_product)
        cartDB = CartDB.getInstance(this)!!

        detailProduct()

        ...
    }

    @SuppressLint("SetTextI18n")
    private fun detailProduct() {
        val data = intent.getStringExtra("extra")
        cartItem = Gson().fromJson(data, ModelProduct::class.java)

        Glide.with(this@DetailProductActivity).load(cartItem.image).into(img_product_detail)
        price_product_detail.text = "Rp. ${cartItem.price}"
        name_product_detail.text = cartItem.name
        merk_product.text = "Merk : "+GlobalData.merkProduct
        stock_product.text = "Stok Tersedia : "+GlobalData.stockProduct.toString()
        desc_product.text = GlobalData.descProduct
    }

    private fun updateData(data: ModelProduct) {
        CompositeDisposable().add(io.reactivex.Observable.fromCallable { cartDB.daoCart().update(data) }
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                Log.d("respons","data inserted")
                Toast.makeText(this, "Berhasil menambahkan ke keranjang",Toast.LENGTH_SHORT).show()
            })
    }

    private fun insertData() {
        CompositeDisposable().add(io.reactivex.Observable.fromCallable { cartDB.daoCart().insert(cartItem) }
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                Log.d("respons","data inserted")
                Toast.makeText(this, "Berhasil menambahkan ke keranjang",Toast.LENGTH_SHORT).show()
            })
    }

}

但是当我将数据添加到购物车表时,名称和价格产品文本没有出现,图像出现并与数据匹配,而价格可以在添加到购买金额时计算出来。

private fun showProduct() {
        list = cartDB.daoCart().getAll() as kotlin.collections.ArrayList
        val layoutManager = LinearLayoutManager(this)
        layoutManager.orientation = LinearLayoutManager.VERTICAL

        adapter = CartAdapter(this, list, object : CartAdapter.Listeners{
            override fun onUpdate() {
                countTotal()
            }

            override fun onDelete(position: Int) {
                list.removeAt(position)
                adapter.notifyDataSetChanged()
                countTotal()
            }
        })

        rv_cart.adapter = adapter
        rv_cart.layoutManager = layoutManager
    }

showProduct()
功能包含在
CartActivity
中。但是我仍然怀疑我在这个Adapter类中存储从
DetailProductActivity
CartActivity
的数据

class CartAdapter(var context: Context, var data: ArrayList<ModelProduct>, var listener: Listeners) : RecyclerView.Adapter<CartAdapter.ViewHolder>() {
    interface Listeners {
        fun onUpdate()
        fun onDelete(position: Int)
    }

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var name = view.name_product_checkout.text
        var price = view.price_product_checkout.text
        var image = view.img_product_checkout
        var cardview = view.findViewById<CardView>(R.id.cv_item)

        var btnadd = view.findViewById<ImageButton>(R.id.btn_add_count)
        var btnmin = view.findViewById<ImageButton>(R.id.btn_min_count)
        var txcounts = view.findViewById<TextView>(R.id.tx_count)

        var btndelete = view.findViewById<TextView>(R.id.remove_cart)
        var checkbox = view.findViewById<CheckBox>(R.id.checkbox_cart)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CartAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.cart_item, parent, false)

        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: CartAdapter.ViewHolder, position: Int) {
        val cart = data[position]
        val prices = Integer.valueOf(cart.price)

        holder.name = cart.name
 
        GlobalData.nameProduct = cart.name

        holder.price = ((prices * cart.quantity).toString())
        GlobalData.priceProduct = cart.price

        var quantities = cart.quantity
        holder.txcounts.text = quantities.toString()

        holder.checkbox.isChecked = cart.selected
        holder.checkbox.setOnCheckedChangeListener { button, isChecked ->
            cart.selected = isChecked
            updateCarts(cart)
        }

        holder.btndelete.setOnClickListener {
            deleteCarts(cart)
            listener.onDelete(position)
        }

        val image = cart.image
        Glide.with(context).load(image).placeholder(R.drawable.ic_fastfood).into(holder.image)

        holder.btnadd.setOnClickListener {
            quantities++
            cart.quantity = quantities
            updateCarts(cart)

            holder.txcounts.text = quantities.toString()
            GlobalData.priceProduct = (prices * quantities)
        }
    ...
   }
}

谁能给我提示?我试图直接为每个变量声明一个伴随对象,但它没有用

android kotlin android-volley android-room
© www.soinside.com 2019 - 2024. All rights reserved.