Получить обновленный идентификатор из первичного ключа автогенерации объекта - PullRequest
0 голосов
/ 30 октября 2019

Я создал класс Alarm и аннотировал его как Entity в Android Studio. В этом классе я поместил переменную id в качестве первичного ключа сущности, и он генерируется автоматически.

@Entity(tableName = "alarm_data_table")
class Alarm(

    @ColumnInfo(name = "alarm_hour")
    var alarmHour: Int,

    @ColumnInfo(name = "alarm_min")
    var alarmMin: Int,

    @ColumnInfo(name = "is_am")
    var isAM: Boolean,

    var days: ArrayList<Int>?,

    @ColumnInfo(name = "is_on")
    var isOn: Boolean,

    var label: String,

    @PrimaryKey(autoGenerate = true)
    val id: Int = 0
) {

    fun setAlarmSchOnOff(isOn: Boolean, activity: Activity){
        if (isOn){setAlarmScheduleOn(activity)}
        if (!isOn){setAlarmScheduleOff(activity)}
    }


    fun setAlarmScheduleOn (activity: Activity) {
        val alarmManager = activity.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        Log.d("ALARM ON", Integer.toString(id))
        val alarmIntent = Intent(activity, AlarmReceiver::class.java).let { intent ->
            intent.putExtra(Constants().ALARM_LABEL_KEY,label)
            PendingIntent.getBroadcast(
                activity,
                id,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT
            )
        }

        val calendar: Calendar = Calendar.getInstance().apply {
            timeInMillis = System.currentTimeMillis()
            set(Calendar.HOUR_OF_DAY, alarmHour)
            set(Calendar.MINUTE, alarmMin)
        }

        days?.let {
            it.forEach {
                calendar.set(Calendar.DAY_OF_WEEK, it) }
            alarmManager.setInexactRepeating(
                AlarmManager.RTC_WAKEUP,
                calendar.timeInMillis,
                AlarmManager.INTERVAL_HOUR,
                alarmIntent
            )
        } ?:run{
            alarmManager.set(
                AlarmManager.RTC_WAKEUP,
                calendar.timeInMillis,
                alarmIntent)
        }
    }

    fun setAlarmScheduleOff(activity: Activity) {
        val alarmManager = activity.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        Log.d("ALARM OFF", Integer.toString(alarmId))
        val alarmIntent = Intent(activity, AlarmReceiver::class.java).let { intent ->
            PendingIntent.getBroadcast(
                activity,
                id,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT
            )}
        alarmManager.cancel(alarmIntent)
    }
}

Проблема в том, что каждый раз, когда я пытался получить идентификатор для метода setAlarm, он всегда будет возвращать 0.

2019-10-30 15:38:07.441 11066-11066/com.andreasgift.myclock D/ALARM ON: 0

Есть ли способ вернуть значение идентификатора после того, как сущность обновит значение / успешно вставит его в таблицу.

1 Ответ

0 голосов
/ 30 октября 2019

Есть ли способ вернуть значение идентификатора после того, как сущность обновит значение / успешно вставит его в таблицу

  1. Измените на использование (необязательно)

: -

@PrimaryKey(autoGenerate = true)
var id: Long = 0 /*<<<<<<<<<< var not val + Long instead of Int */
  • вы действительно должны использовать Long для столбцов id как
    • a) метод SQliteDatabase insert , который в конечном итоге используется, возвращаетlong и
    • b) (именно поэтому a такой, какой он есть)) rowid (который, по сути, использует автогенерация) может быть больше, чем может содержать Int (то есть 64-битное целое число со знаком).
  • Если вы хотите использовать Int для id , тогда вы можете использовать myAlarm.id = (alarmDao.insertAlarm(myAlarm)).toInt() вместо myAlarm.id = alarmDao.insertAlarm(myAlarm)

И использоватьDao

@Insert
fun insertAlarm(alarm :Alarm) :Long
  • т.е. установите его так, чтобы он возвращал: Long

Вставка теперь возвращает идентификатор (или -1, если вставка не вставиларяд). Если вы все еще используете объект Alarm после вставки, вы можете использовать что-то вроде: -

    myAlarm.id = alarmDao.insertAlarm(myAlarm) /*<<<<<<<<<< SET THE id according to the inserted id */
...