android - 尝试使用 Observable 时获取 Fata 信号 11

标签 android android-studio kotlin rx-java2 android-room

我正在做一个项目,第一次尝试 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/

相关文章:

android - 如何在 ConstraintLayout 中旋转 TextView 及其约束边界

types - 奇怪的平等编译错误 : (No method 'equals(Any?): Boolean' available)

android - Kotlin 中每个类只允许有一个伴生对象

android - 如何在后台线程处于 Activity 状态时保持动画运行?

android - 通过 Intent 发送 Arraylist

android - 多个 Dex : in Build Config Files 的问题

android - 安装安卓工作室

kotlin - 我正在尝试使用 Jetpack Compose 在 Android 中设置背景图片,但图片无法填满整个页面

android - 在测试用例后保持检测 Activity

android - 在没有互联网连接的情况下处理 firebase 身份验证(Android)