транзакция области в BroadcastReceiver не работает - PullRequest
0 голосов
/ 03 сентября 2018

Я показываю пользователю уведомление с действиями, я обрабатываю эти действия с помощью BroadcastReceiver, оттуда я обновляю базу данных области, но она не обновляется, хотя я уверен (через журналы), что транзакция получает казнены.

NotificationBroadcastReceiver:

override fun onReceive(context: Context, intent: Intent) {

        val notionId = intent.getStringExtra(NOTION_ID_EXTRA)
        val actionType = intent.getIntExtra(ACTION_TYPE, ACTION_TYPE_PUTBACK)

        when (actionType) {
            ACTION_TYPE_PUTBACK -> {
                Toast.makeText(context, R.string.notion_is_putback, Toast.LENGTH_SHORT).show()
            }

            ACTION_TYPE_ARCHIVE -> {
                NotionsRealm.changeIdleState(notionId, true)
            }
        }

        val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.cancel(NotionsReminder.NOTION_NOTIFICATION_ID)

}

NotionsRealm:

fun changeIdleState(id: String, state: Boolean) {
    val realm = Realm.getDefaultInstance()
    realm.executeTransaction {
        val notion = it.where<Notion>().equalTo("id", id).findFirst()

        notion?.isArchived = state
        debug("${notion?.isArchived}") //prints true to the log, but the data doesn't change.
    }
    closeRealm(realm)
}

private fun closeRealm(realm: Realm) {
    try {
        realm.close()
    } catch (e: Exception) {
        error(e)
    } finally {
        debug("realm closed")
    }
}

редактировать : Я просто позволил получателю запустить пустое действие (без макета) для обработки базы данных. произошло то же самое Я думаю, что это больше не проблема BroadcastReceiver. Странно, но другие операции с областями прекрасно выполняются в других действиях / фрагментах.

1 Ответ

0 голосов
/ 10 сентября 2018

Оказывается, это не проблема с царством, это было как я запустил трансляцию, я сделал это так:

fun notificationAction(context: Context, id: String, actionType: Int): PendingIntent {
    return PendingIntent.getBroadcast(
            context, actionType,
            Intent(context, NotificationBroadcastReceiver::class.java).apply {
                putExtra(NotificationBroadcastReceiver.NOTION_ID_EXTRA, id)
                putExtra(NotificationBroadcastReceiver.ACTION_TYPE, actionType)
            }, 0)
}

Я обнаружил, что переданный идентификатор был неверным, после некоторых поисков я обнаружил, что должен включить этот флаг в трансляцию: PendingIntent.FLAG_UPDATE_CURRENT, вот так:

fun notificationAction(context: Context, id: String, actionType: Int): PendingIntent {
    return PendingIntent.getBroadcast(
            context, actionType,
            Intent(context, NotificationBroadcastReceiver::class.java).apply {
                putExtra(NotificationBroadcastReceiver.NOTION_ID_EXTRA, id)
                putExtra(NotificationBroadcastReceiver.ACTION_TYPE, actionType)
            }, PendingIntent.FLAG_UPDATE_CURRENT)
}

Теперь переданный идентификатор правильный, я до сих пор не понимаю, почему это произошло, или почему дополнительный идентификатор был совершенно другим (но не случайным, я каждый раз видел один и тот же неправильный идентификатор) без этого флага.

...