我正在做一个项目,第一次尝试 Kotlin、RxJava 2 和新的 android 架构组件。我正在尝试在单独的线程上从 Room 执行删除方法,并且在执行方法,并强制关闭。我正在尝试这两个选项:
1.
Single.fromCallable { deviceViewModel.delete(device.phone) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
2.
Observable.just(Unit)
.subscribeOn(Schedulers.io())
.map { deviceViewModel.delete(device.phone) }
.subscribe()
这是我的 DeviceViewModel.kt(使用 AndroidViewModel)
class DeviceViewModel constructor(application: Application) : AndroidViewModel(application) {
@Inject lateinit var db: AppDatabase
init {
(application as KaiApplication).appComponent.inject(this)
}
fun count() = db.deviceModel().count();
fun getDevices() = db.deviceModel().devices();
fun getDevice(phone: String) = db.deviceModel().device(phone)
fun create(device: Device): Device {
db.deviceModel().createOrUpdate(device).let {
return device
}
}
fun createTestDevice(name: String, phone: String) {
db.deviceModel().createTestDevice(name, phone)
}
fun delete(device: Device): Device {
db.deviceModel().delete(device).let {
return device
}
}
fun delete(devicePhone: String) {
db.deviceModel().delete(devicePhone)
}
还有我的 DeviceDao.kt
@Dao
abstract class DeviceDao {
@Query("SELECT COUNT(*) FROM device")
abstract fun count(): Int
@Query("SELECT * FROM device")
abstract fun devices(): Flowable<List<Device>>
@Query("SELECT * FROM device WHERE phone = :p0")
abstract fun device(phone: String): Device?
fun createOrUpdate(device: Device) {
Timber.d("Device to create $device")
insertOrUpdate(device)
}
fun createTestDevice(name: String, phone: String) {
val device: Device = Device()
device.phone = phone
device.name = name
device.password = "12345"
Timber.d("Device to create $device")
insertOrUpdate(device)
}
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insertOrUpdate(vararg devices: Device)
@Query("DELETE FROM device WHERE phone = :p0")
abstract fun delete(phone: String)
@Delete
abstract fun delete(device: Device)
我试图解决这个问题,但没有成功。任何帮助都会派上用场。谢谢!
最佳答案
我遇到了几乎相同的问题。我的场景是这样的:我有一个 RecyclerView
列表,列表中的每个项目都有一个删除按钮。删除按钮触发了一个 Observable
,它从 Room 表中删除了项目。与此同时,另一个 Observable
正在观察项目表,它正在更新使用 PagedList
适配器的 RecyclerView
。
OP 在评论中暗示这可能是问题所在,只是想确认一下:在将我的代码转换为使用 LiveData 而不是 RxJava 之后,我收到了一条正确的错误消息,即 FOREIGN KEY CONSTRAINT
删除项目时失败(在我的例子中,我有另一个实体链接到被删除的实体,并且我将 onDelete
设置为 RESTRICT
)。
出于某种原因,这个特定的错误导致 RxJava 完全崩溃,而不是返回错误消息。似乎是一个错误。
关于android - 尝试使用 Observable 时获取 Fata 信号 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44579412/