我正在使用 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 是否有序列或创建许多习惯
为了获取序列,我创建了一个 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
}