gpt4 book ai didi

Android Room LiveData Observer 未更新

转载 作者:行者123 更新时间:2023-12-05 00:19:39 25 4
gpt4 key购买 nike

我有一个 FragmentRecyclerView在里面。我使用 ViewModel持有LiveData从房间数据库中显示并尝试更新 RecyclerView通过观察 ViewModel 中的数据.但是 Observer当我打开 fragment 时,只会被调用一次。我从不同的 Fragment 更新 Room 数据库比Observer开启。

无论我添加一个新的Event或删除或更新一个,Observer永远不会被调用!我怎样才能得到 Observer正确调用?我的错误在哪里?

分段
onViewCreated中的代码不适用于 onCreate ,它在 val recyclerview = upcoming_recycler 行返回 null .
您还可以在 onViewCreated 的末尾看到我在其中打开一个新 fragment ,从中更新数据库。请注意 UpcomingFragment位于不同的 FragmentLayoutEventEditFragment !

class UpcomingFragment : Fragment(R.layout.fragment_upcoming) {

private val clubDb by lazy {
ClubDatabase.getClubDatabase(requireContext().applicationContext)
}

private val eventAdapter = EventAdapter(null, this)

private val upcomingViewModel: UpcomingViewModel by viewModels()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val recyclerView = upcoming_recycler
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.setHasFixedSize(true)

upcomingViewModel.eventsToShow.observe(viewLifecycleOwner, Observer { events ->
Log.d(TAG, "Live data changed in upcomingfragment!!!")
eventAdapter.setData(events.toTypedArray())
})

recyclerView.adapter = eventAdapter

// add a new Event
upcoming_fab.setOnClickListener {
parentFragmentManager.beginTransaction()
.replace(R.id.main_fragment_layout_overlay, EventEditFragment())
.addToBackStack(EVENT_EDIT_FRAGMENT)
.commit()
}
// and more stuff...
}
//the rest of the class
}

View 模型
class UpcomingViewModel(application: Application) : ViewModel() {
val eventsToShow: LiveData<List<Event>>

init {
val roundToDay = SimpleDateFormat("dd.MM.yyy", Locale.GERMAN)
var today = Date()
today = roundToDay.parse(roundToDay.format(today))!!
val tomorrow = Date(today.time + 86400000L)
eventsToShow = ClubDatabase.getClubDatabase(application.applicationContext).clubDao()
.getEventsByClubIdAfterDate(CURRENT_CLUB_ID, tomorrow)
}
}

事件适配器
class EventAdapter(
private var dataSet: Array<Event>?,
private val onEventItemClickListener: OnEventItemClickListener
) : RecyclerView.Adapter<EventAdapter.EventViewHolder>() {

class EventViewHolder(val view: View) : RecyclerView.ViewHolder(view)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EventViewHolder {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.event_item_layout, parent, false)
return EventViewHolder(view)
}

override fun onBindViewHolder(holder: EventViewHolder, position: Int) {
// show the item & add onEventItemClickListener for updating
}

fun setData(new: Array<Event>) {
this.dataSet = new
this.notifyDataSetChanged()
}

override fun getItemCount(): Int {
return dataSet?.size ?: 0
}
}

数据库
@Database(
entities = [Event::class, Member::class, RequiredMembersForEvents::class, AttendedMembersForEvents::class],
version = 9,
exportSchema = false
)
@TypeConverters(Converters::class)
abstract class ClubDatabase : RoomDatabase() {
abstract fun clubDao(): ClubDao

companion object {
@Volatile
private var INSTANCE: ClubDatabase? = null

fun getClubDatabase(context: Context): ClubDatabase {
return INSTANCE ?: synchronized(this) {
val instance = INSTANCE
return if (instance != null) {
instance
} else {
Room.databaseBuilder(
context.applicationContext,
ClubDatabase::class.java,
"club-db"
)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build()
}
}
}
}
}


@Dao
interface ClubDao {

@Query("SELECT * FROM events WHERE clubId = :clubId AND dateTimeFrom > :date ORDER BY dateTimeFrom ASC")
fun getEventsByClubIdAfterDate(clubId: String, date: Date): LiveData<List<Event>>

// the rest of the DAO
}

最佳答案

检查您的数据库单例实现,因为那里的变量 INSTANCE - 始终为空。当您获得类的实例时,您应该在第一次设置它。否则,您的应用程序将处理数据库类的不同实例。

可能这会导致问题,尽管对数据库进行了一些更改,但 LiveData 的这些更改的观察者没有被触发。

关于Android Room LiveData Observer 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61979420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com