如何在可组合按钮中调用 try/catch

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

我需要在可组合按钮单击事件中捕获 SQLiteException。我正在执行 Room 函数来插入记录。它有一个唯一约束字段/索引。

我找到了以下代码

并找到了 Stackoverflow 链接

我尝试了接受的选项和第三个选项,但没有成功。

这是我的代码:

ADO ///////

interface houseDAO {

@Insert(onConflict = OnConflictStrategy.ABORT )
@Throws(SQLiteException::class)
suspend fun addHouse(houseEntity: HouseEntity)

//More DAO functions

}

存储库 ////////

class InventoryRepository (val inventoryDB: InventoryDB){

suspend fun addhouseToRoom(houseEntity: HouseEntity){
    inventoryDB.houseDao().addHouse(houseEntity)
}

 //More functions
}

视图模型 //////////

class InventoryViewModel(val repository: InventoryRepository): ViewModel() {

fun addhouse(house: HouseEntity) {
    viewModelScope.launch {
        repository.addhouseToRoom(house)
    }
}

//More functions
}

可组合函数 ///////////

//More functions

Column(
            modifier = Modifier
                .padding(top = 22.dp, start = 6.dp, end = 6.dp)
                .fillMaxWidth(),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {

            val coroutineScope = rememberCoroutineScope()

            //Commented line because the addfloor function does not returns any value  
            //val (loadResult, setLoadResult) = remember { mutableStateOf<String?>(null) }

            Button(
                onClick = {
                    coroutineScope.launch {
                        withContext(Dispatchers.IO) {
                            try {
                                viewModel.addfloor(
                                    FloorEntity(
                                        0,
                                        houseId!!.toLong(),
                                        infloor,
                                        "$location.$infloor"
                                    )
                                )
                                mToast("Floor Added", mContext)
                            } catch (e: SQLiteException) {
                                msgbox(
                                    mContext,
                                    e.message.toString(),
                                    "Floor Could not be Added"
                                )
                            }
                        }
                    }
                },
                colors = ButtonDefaults.buttonColors(Color.Blue)

            ) {
                Text(text = "Add Floor in to House")
            }
        }

//More functions    

错误在应用程序的另一个位置捕获,我有一个捕获所有错误段。

android kotlin android-jetpack-compose try-catch sqliteexception
1个回答
0
投票

我直接在 Viewmodel 中尝试,它可以工作。

DAO 和 Repository 代码是相同的

视图模型 ////////

fun addroom(mContext: Context, room: RoomEntity) {
   viewModelScope.launch {
       try {
           repository.addroomToRoom(room)
           msgbox(mContext, "", "Room Added")
       } catch (e: SQLiteException) {
           msgbox(mContext, e.message.toString(), "Room Could not be Added")
       }
   }
}

可组合函数 ////////

Button(
                onClick = {
                        viewModel.addroom(mContext,
                            RoomEntity(
                                0,
                                floorId!!.toLong(),
                                inroomname,
                                inroomtype.value,
                                "$location.$inroomname"
                            )
                        )
                        //mToast("Room Added", mContext)
                },
                colors = ButtonDefaults.buttonColors(Color.Blue)

            ) {
                Text(text = "Add Romm into Floor")
            }

为了简单起见,我删除了 Toast 消息,并将成功消息添加为尝试代码的一部分。我从 Compose 函数添加了 Context,但我认为您可以直接在 Viewmodel 中获取 Context。

© www.soinside.com 2019 - 2024. All rights reserved.