gpt4 book ai didi

即使数据库不为空,Android Room Select 查询也会返回 null 或空字符串

转载 作者:行者123 更新时间:2023-12-04 23:49:11 39 4
gpt4 key购买 nike

我是安卓和房间的新手。我正在尝试创建一个本地数据库,但我在数据库不为空的情况下苦苦挣扎,如下图所示。但是当我尝试选择任何数据时,它会返回一个空列表或空值。请注意,插入查询工作正常。
enter image description here
代码:
实体:

@Entity(tableName = "product_table")
@Parcelize
data class Product(

@PrimaryKey
@SerializedName("id")
val id : String,
@SerializedName("title")
val title : String,
@SerializedName("price")
val price : String,
@SerializedName("category")
val category : String,
@SerializedName("description")
val description : String,
@SerializedName("image")
val image : String,

val color : String,
val size : String
): Parcelable
道:
@Dao
interface CartDao {

@Query("SELECT * FROM product_table")
fun get_all_carts(): LiveData<List<Product>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert_item_to_cart(product: Product) : Long

@Delete
suspend fun delete_item_from_cart(product: Product)


@Query("Delete FROM product_table")
fun delete_all_cart()

}
数据库:
@Database(entities = [Product::class], version = 1)
abstract class ProductDatabase : RoomDatabase() {

abstract fun productDao(): CartDao

companion object{
@Volatile
private var INSTANCE: ProductDatabase? = null

fun getDataseClient(context: Context) : ProductDatabase {

if (INSTANCE != null) return INSTANCE!!

synchronized(this) {

INSTANCE = Room
.databaseBuilder(context, ProductDatabase::class.java, "product_database")
.fallbackToDestructiveMigration()
.build()

return INSTANCE!!

}
}
}
}
存储库:

class CartRepository {

companion object {

var productDatabase: ProductDatabase? = null

var product: LiveData<Product>? = null

fun initializeDB(context: Context) : ProductDatabase {
return ProductDatabase.getDataseClient(context)
}

fun get_all_data(context: Context) : List<Product> {

productDatabase = initializeDB(context)
var temp_list = emptyList<Product>()

CoroutineScope(Dispatchers.IO).launch {
temp_list = productDatabase!!.productDao().get_all_carts()
}
return temp_list
}

fun get_first_item(context: Context, input_id : String) : Product {

productDatabase = initializeDB(context)
var temp_item : Product = Product("","","","","","","","")

CoroutineScope(Dispatchers.IO).launch {
temp_item = productDatabase!!.productDao().get_item(input_id)
}
return temp_item
}



}
}
查看型号:

@HiltViewModel
class CartFragmentViewModel @Inject constructor(
private val productDao : CartDao
) : ViewModel() {

var products_list : MutableLiveData<List<Product>>

init {
products_list = MutableLiveData()
}

fun get_all_products(context: Context) : List<Product>{

return CartRepository.get_all_data(context)

}
fun get_first_item(context: Context, input_id : String) : Product{

return CartRepository.get_first_item(context, input_id)

}
}
分段:

class CartFragment @Inject constructor(

) : Fragment(R.layout.cart_fragment_layout) {


lateinit var cart_list : List<Product>

val cart_adapter = CartRecyclerViewAdapter()

val viewModel by activityViewModels<CartFragmentViewModel>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

rv_cart.adapter = cart_adapter
rv_cart.layoutManager = LinearLayoutManager(
activity?.applicationContext,
LinearLayoutManager.VERTICAL,
false
)
rv_cart.setHasFixedSize(true)

/*cart_list = viewModel.get_all_products(activity?.applicationContext!!)
cart_adapter.submitList(
cart_list
)
cart_adapter.notifyDataSetChanged()
Log.d(TAG, "Fetched Data: {${cart_list.get(1).title}}")*/

var p = viewModel.get_first_item(activity?.applicationContext!!, "1")
cart_adapter.submitList(
listOf(
p
)
)
cart_adapter.notifyDataSetChanged()
var s = p.title
Log.d(TAG, "Fetched Data: {$s}")

/*viewModel.get_first_item(activity?.applicationContext!!).observe(viewLifecycleOwner, Observer {
cart_adapter.submitList(listOf(it))
cart_adapter.notifyDataSetChanged()
})*/

//viewModel.get_first_item(activity?.applicationContext!!)
}
}
Fragment有很多评论和日志上课是为了弄清楚问题所在。我真的不知道发生了什么以及何时使用 LiveData作为 dao get 函数的返回类型,应用程序崩溃。希望有人可以帮助我并感谢您的关注。

最佳答案

您的 的问题购物车存储库 方法。

 fun get_first_item(context: Context, input_id : String) : Product {

productDatabase = initializeDB(context)
var temp_item : Product = Product("","","","","","","","")

CoroutineScope(Dispatchers.IO).launch {
temp_item = productDatabase!!.productDao().get_item(input_id)
}
return temp_item
}
在上面的方法中,您在后台线程中获取一个项目,这意味着它进入另一个线程并允许返回 temp_item 始终立即返回,而不会阻塞代码等待结果,这就是您获得 null 和/或空的原因列表。
解决方案是 :
使 中的所有数据库操作方法购物车存储库 暂停,见下文:
注意:我使用对象而不是类
object CartRepository {


var productDatabase: ProductDatabase? = null


fun initializeDB(context: Context) : ProductDatabase {
return ProductDatabase.getDataseClient(context)
}

suspend fun get_all_data(context: Context) : List<Product> {

productDatabase = initializeDB(context)

return productDatabase!!.productDao().get_all_carts()
}

suspend fun get_first_item(context: Context, input_id : String) : Product {

productDatabase = initializeDB(context)
return productDatabase!!.productDao().get_item(input_id)
}
}
在你的 viewModel 中调用 中的这个挂起函数查看模型范围 如下所示:
@HiltViewModel
class CartFragmentViewModel @Inject constructor(
private val productDao : CartDao
) : ViewModel() {



.....
var productData = MutableLiveData<Product>()

fun get_first_item(context: Context, input_id: String) {

viewModelScope.lauch(Dispatchers.IO){
val data = CartRepository.get_first_item(context, input_id)
withContext(Dispatchers.Main){
productData.value = data
}

}

}
……
在您的 fragment 通话中 get_first_item 首先观察你的数据产品数据,你也可以按照所有步骤对其他数据库操作做同样的事情。
如果您不理解任何代码,我希望这会对您有所帮助,请在评论中告诉我,请忽略错别字

关于即使数据库不为空,Android Room Select 查询也会返回 null 或空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67428696/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com