3

我正在做一个项目,第一次尝试 Kotlin、RxJava 2 和新的 android 架构组件。我正在尝试在单独的线程上从 Room 执行删除方法,并且ERROR: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12673 (RxCachedThreadS)在执行该方法时得到了结果,并且强制关闭。我正在尝试这两个选项:

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)

我试图解决这个问题,但没有成功。任何帮助都会到来。谢谢!

4

1 回答 1

1

我有几乎同样的问题。我的场景是这样的:我有一个RecyclerView列表,列表中的每个项目都有一个删除按钮。删除按钮触发Observable从房间表中删除项目。同时,另一个Observable正在更新RecyclerView正在使用PagedList适配器的项目表正在观察项目表。

OP 暗示这可能是评论中的问题,只是想确认:在将我的代码转换为使用 LiveData 而不是 RxJava 后,我收到了一条正确的错误消息,这是FOREIGN KEY CONSTRAINT删除项目时失败(在我的情况下,我有另一个实体链接到被删除的实体,我已onDelete设置为RESTRICT)。

由于某种原因,这个特定的错误导致 RxJava 完全崩溃,而不是返回错误消息。似乎是一个错误。

于 2019-06-24T10:08:59.803 回答