我需要在可组合按钮单击事件中捕获 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
错误在应用程序的另一个位置捕获,我有一个捕获所有错误段。
我直接在 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。