如何获取 Firebase 正确的连续习惯序列

问题描述 投票:0回答:1

我正在使用 Firebase 创建习惯跟踪器应用程序。我想按降序排列最后完成的习惯。如果一个习惯是错误的,它就停止计数

{
  "habits": {
    "-nx...": {
      "dailyActivities": {
        "-Nm...": {
          "date": "2023-12-26",             
          "done": true              
        },
        "-Nm...": {
          "date": "2023-12-25",              
          "done": true,
        },
        "-Nm...": {
          "date": "2023-12-28",             
          "done": true,
        },
        "-Nm...": {
          "date": "2023-12-24",             
          "done": true,
        }
      }
    }
  }
}

仅获得 1 连胜,因为 28 是当前罢工并且没有下一个序列。

问题是,如果您点击复选框保存在 Firebase 中,则仅保存 dailyActivity,例如第 27 天没有保存,因为尚未保存

模型类

data class Habit
    (
    var id: String?,
    var name: String,
    var description: String,
    var userId: String,
    var reminder: Reminder,
    var dateEnd: String?,
    var iconColor: String,
    var rangeOption: RangeOption,
    var goal: GoalType,
    var duration: DurationTimer,
    var activities: List<DailyActivity>
)

class DailyActivity {

    var date: String? = ""
    var done: Boolean? = false
    var duration: DurationTimer = DurationTimer()

}

class DurationTimer {

    var hour: Int? = null
    var minute: Int? = null
    var second: Int? = null

}

enum class RangeOption {
    Off,Yes
}

class HabitViewModel : ViewModel() {

    private val habitDatabase: DatabaseReference by lazy {
        FirebaseDatabase.getInstance().getReference("habits")
    }

    private val dailyActivityDatabase: DatabaseReference by lazy {
        FirebaseDatabase.getInstance().getReference("dailyActivities")
    }

    private fun getAllDailyActivitiesByHabitId(habitId: String) {
        habitDatabase.child(habitId).child("dailyActivities")
    }

    private val _habitsLiveData = MutableLiveData<MutableList<Pair<Habit, DailyActivity?>>>()
    val habitsLiveData: LiveData<MutableList<Pair<Habit, DailyActivity?>>> = _habitsLiveData

    suspend fun getReverseDailyActiviesByHabitId(habitId: String): List<DailyActivity> {
        val dailyActivityRef =
            habitDatabase.child(habitId).child("dailyActivities").orderByChild("date")

        val dataSnapshot = dailyActivityRef.get().await()
        val dailyActivities = mutableListOf<DailyActivity>()

        dataSnapshot.children.forEach { data ->
            val date = data.child("date").getValue(String::class.java)
            val done = data.child("done").getValue(Boolean::class.java)
            if (date != null && done != null) {
                val dailyActivity = DailyActivity()
                dailyActivity.date = date
                dailyActivity.done = done
                dailyActivities.add(dailyActivity)
            }
        }
        return dailyActivities.reversed()
    }
}

HabitDetailsActivity 类:AppCompatActivity() {

private lateinit var binding: FragmentCommonDetailBinding

private lateinit var habitViewModel: HabitViewModel

private var dailyActivities = listOf<DailyActivity>() 

override fun onCreate(savedInstanceState: Bundle?) {

 dailyActivities = habitViewModel.getReverseDailyActiviesByHabitId(id!!)
 //get all dailyActivities Descending

 binding.textViewStrikeValue.text = //bind streak

如何知道序列并在没有下一个且不正确的情况下停止?我不知道是否需要创建一个函数来尝试检查 dailyactivy 是否有序列或创建许多习惯

最终结果:

android firebase firebase-realtime-database
1个回答
0
投票

为了获取序列,我创建了一个 LocalDate 来获取今天,并执行 for 与 dailyActivites 日期进行比较,并检查执行布尔值的活动是否为 true

private fun getCurrentStrike() {
    var currentStreak = 0
    for(activity in dailyActivities) {
        val activityDate = LocalDate.parse(activity.date, DateTimeFormatter.ISO_LOCAL_DATE)

        if(activity.done == true && activityDate.equals(today)) {
            currentStreak++
        } else {
            break
        }
        today = today.minusDays(1)
    }
    binding.textViewStrikeValue.text = currentStreak.toString()
    System.out.println("Current Streak: " + currentStreak);
}

通过下面的这个函数,您可以获得按日期降序排列的列表

suspend fun getReverseDailyActiviesByHabitId(habitId: String): List<DailyActivity> {
        val dailyActivityRef =
            habitDatabase.child(habitId).child("dailyActivities").orderByChild("date")

        val dataSnapshot = dailyActivityRef.get().await()
        val dailyActivities = mutableListOf<DailyActivity>()

        dataSnapshot.children.sortedByDescending { it.child("date").getValue(String::class.java) }
            .forEach { data ->
                val date = data.child("date").getValue(String::class.java)
                val done = data.child("done").getValue(Boolean::class.java)

                if (date != null && done != null) {
                    val dailyActivity = DailyActivity()
                    dailyActivity.date = date
                    dailyActivity.done = done
                    dailyActivities.add(dailyActivity)
                }
            }
        return dailyActivities
    }
© www.soinside.com 2019 - 2024. All rights reserved.