ViewModel с использованием ошибки комнаты базы данных Android Studio ⇐ Android
-
Anonymous
ViewModel с использованием ошибки комнаты базы данных Android Studio
В настоящее время я столкнулся с ошибкой: домашний фрагмент и использование модели представления, recyclerview для реализации CRUD. ошибка заключается в том, что я вхожу в систему, используя идентификатор и пароль во фрагменте входа, появляется ошибка, и ошибка говорит, что невозможно создать экземпляр класса NoteViewModel, и я не знаю, где часть неверна
это домашний фрагмент
пакет com.example.challenge4binar импортировать android.app.AlertDialog импортировать android.content.Context импортировать android.content.SharedPreferences импортировать android.os.Bundle импортировать android.view.LayoutInflater импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.EditText импортировать androidx.fragment.app.Fragment импортировать androidx.fragment.app.viewModels импортировать androidx.navigation.findNavController импортировать com.example.challenge4binar.databinding.FragmentHomeBinding // ЗАДАЧА: переименовать аргументы параметра, выбрать подходящие имена // параметры инициализации фрагмента, например. ARG_ITEM_NUMBER частная константа val ARG_PARAM1 = "param1" частная константа val ARG_PARAM2 = "param2" /** * Простой подкласс [Fragment]. * Используйте фабричный метод [HomeFragment.newInstance] для * создать экземпляр этого фрагмента. */ класс HomeFragment : Fragment() { // TODO: Переименовать и изменить типы параметров частный var param1: строка? = ноль частный var param2: String? = ноль частный var _binding: FragmentHomeBinding? = ноль частная привязка val get() = _binding!! частный lateinit var SharedPreferences: SharedPreferences частный val noteViewModel: NoteViewModel от viewModels() переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) аргументы?.let { параметр1 = it.getString(ARG_PARAM1) параметр2 = it.getString(ARG_PARAM2) } } переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { // Раздуваем макет для этого фрагмента _binding = FragmentHomeBinding.inflate(инфлятор, контейнер, ложь) SharedPreferences = requireContext().getSharedPreferences("myPrefs", Context.MODE_PRIVATE) вернуть привязку.корень } сопутствующий объект { /** * Используйте этот фабричный метод для создания нового экземпляра * этот фрагмент, используя предоставленные параметры. * * @param param1 Параметр 1. * @param param2 Параметр 2. * @return Новый экземпляр фрагмента HomeFragment. */ // TODO: переименовать и изменить типы и количество параметров @JvmStatic fun newInstance(param1: String, param2: String) = HomeFragment().apply { аргументы = Bundle().apply { putString(ARG_PARAM1, параметр1) putString(ARG_PARAM2, параметр2) } } } переопределить fun onViewCreated(view: View, saveInstanceState: Bundle?) { super.onViewCreated(просмотр, сохраненныйInstanceState) привязка.tvLogout.setOnClickListener { it.findNavController().navigate(R.id.action_homeFragment_to_loginFragment) } val адаптер = NoteAdapter(requireContext(), noteViewModel, mutableListOf()) val recyclerView =binding.rvNote recyclerView.adapter = адаптер noteViewModel.allNotes.observe(viewLifecycleOwner) { примечания -> если (notes.isEmpty()) { привязка.tvDatakosong.visibility = Вид.VISIBLE привязка.rvNote.visibility = Вид.GONE } еще { привязка.tvDatakosong.visibility = Вид.GONE привязка.rvNote.visibility = Вид.VISIBLE адаптер.setNotes(заметки) } } привязка.btnTambahHome.setOnClickListener{ диалогтамба() } } веселый диалогтамба() { val builder = AlertDialog.Builder(requireContext()) val инфлатер = макетИнфлатер val диалогView = inflater.inflate(R.layout.tambah, null) builder.setView(диалогView) builder.setTitle("Данные Тамбы") builder.setPositiveButton("Добавить") { диалог, _ -> val contentEditText = диалогView.findViewById(R.id.et_judul_tambah) val titleEditText = диалогView.findViewById(R.id.et_catatan_tambah) val notecontent = contentEditText.text.toString() val titlenote = titleEditText.text.toString() if (notecontent.isNotEmpty() && titlenote.isNotEmpty()) { val newNote = Note(note = notecontent, title = titlenote) noteViewModel.insert(newNote) } } } } это noteviewmodel
пакет com.example.challenge4binar импортировать androidx.lifecycle.LiveData импортировать androidx.lifecycle.ViewModel импортировать androidx.lifecycle.viewModelScope импортировать kotlinx.coroutines.launch класс NoteViewModel (частный репозиторий val: NoteRepository): ViewModel () { val allNotes: LiveData =repository.allNotes забавная вставка (примечание: Примечание) = viewModelScope.launch { репозиторий.insert(примечание) } забавное обновление (примечание: Примечание) = viewModelScope.launch { репозиторий.обновление (примечание) } весело удалить (примечание: Примечание) = viewModelScope.launch { репозиторий.delete (примечание) } } это noteRepository
пакет com.example.challenge4binar импортировать androidx.lifecycle.LiveData класс NoteRepository(private val noteDao: NoteDao) { val allNotes: LiveData = noteDao.getAllNotes() приостановить забавную вставку (примечание: Примечание) { noteDao.insert(примечание) } приостановить забавное обновление (примечание: Примечание) { noteDao.update(примечание) } приостановить веселье удалить (примечание:Примечание){ noteDao.delete(примечание) } } это Примечание
@Entity(tableName = "notes") класс данных Примечание( @PrimaryKey(autoGenerate = true)val id:Long = 0, вар заголовок:Строка, вар примечание:Строка ) а это адаптер для заметок
пакет com.example.challenge4binar импортировать android.app.AlertDialog импортировать android.content.Context импортировать android.view.LayoutInflater импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.Button импортировать android.widget.EditText импортировать android.widget.ImageView импортировать androidx.recyclerview.widget.RecyclerView класс NoteAdapter( частный контекст val: Контекст, частный val noteViewModel: NoteViewModel, частные примечания val: MutableList):RecyclerView.Adapter() { внутренний класс ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) { val deleteButton: ImageView = itemView.findViewById(R.id.btn_delete_rv) val updateButton: ImageView = itemView.findViewById(R.id.btn_update_rv) забавная связка (примечание: Примечание) { deleteButton.setOnClickListener { диалогхапус (примечание) } updateButton.setOnClickListener { диалоговое обновление (примечание) } } } переопределить удовольствие onCreateViewHolder (родитель: ViewGroup, viewType: Int): NoteAdapter.ViewHolder { val itemView = LayoutInflater.from(parent.context).inflate(R.layout.delete, родительский, false) вернуть ViewHolder (itemView) } переопределить удовольствие onBindViewHolder(держатель: NoteAdapter.ViewHolder, позиция: Int) { val note = примечания[позиция] держатель.bind (примечание) } переопределить удовольствие getItemCount(): Int { вернуть примечания.размер } частный забавный диалогхапус (примечание: Примечание) { val builder = AlertDialog.Builder(контекст) builder.setTitle("Удалить заметку") builder.setPositiveButton("Delete") { диалог, _ -> noteViewModel.delete (примечание) val позиция = примечания.indexOf(примечание) если (позиция != -1) { примечания.removeAt(позиция) notifyItemRemoved (позиция) } диалог.отклонить() } builder.setNegativeButton("Отмена") { диалог, _ -> диалог.отклонить() } строитель.шоу() } частный диалог обновления (примечание: Примечание) { val builder = AlertDialog.Builder(контекст) val inflater = LayoutInflater.from(контекст) val диалогView = inflater.inflate(R.layout.update, null) // Используйте var вместо val для этих переменных var etJudul = диалогView.findViewById(R.id.et_judul_edit) var etCatatan = диалогView.findViewById(R.id.et_catatan_edit) val btnInput = диалогView.findViewById(R.id.btn_edit) etJudul.setText(note.title) etCatatan.setText(note.note) builder.setView(диалогView) builder.setTitle("Примечание к обновлению") val диалог = builder.create() btnInput.setOnClickListener { // Здесь обрабатываем логику обновления val updateTitle = etJudul.text.toString() val updateNote = etCatatan.text.toString() if (updatedTitle.isNotEmpty() && updateNote.isNotEmpty()) { // Обновляем заметку новыми данными note.title = обновленный заголовок note.note = обновленноеПримечание // Вызовите здесь свой метод обновления или функцию ViewModel // Например: noteViewModel.update(note) // Закрываем диалог после завершения обновления диалог.отклонить() } еще { // Отображение сообщения об ошибке или обработка пустых полей } } диалог.шоу() } весело setNotes(newNotes: List){ примечания.очистить() примечания.addAll(новыеПримечания) } }
В настоящее время я столкнулся с ошибкой: домашний фрагмент и использование модели представления, recyclerview для реализации CRUD. ошибка заключается в том, что я вхожу в систему, используя идентификатор и пароль во фрагменте входа, появляется ошибка, и ошибка говорит, что невозможно создать экземпляр класса NoteViewModel, и я не знаю, где часть неверна
это домашний фрагмент
пакет com.example.challenge4binar импортировать android.app.AlertDialog импортировать android.content.Context импортировать android.content.SharedPreferences импортировать android.os.Bundle импортировать android.view.LayoutInflater импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.EditText импортировать androidx.fragment.app.Fragment импортировать androidx.fragment.app.viewModels импортировать androidx.navigation.findNavController импортировать com.example.challenge4binar.databinding.FragmentHomeBinding // ЗАДАЧА: переименовать аргументы параметра, выбрать подходящие имена // параметры инициализации фрагмента, например. ARG_ITEM_NUMBER частная константа val ARG_PARAM1 = "param1" частная константа val ARG_PARAM2 = "param2" /** * Простой подкласс [Fragment]. * Используйте фабричный метод [HomeFragment.newInstance] для * создать экземпляр этого фрагмента. */ класс HomeFragment : Fragment() { // TODO: Переименовать и изменить типы параметров частный var param1: строка? = ноль частный var param2: String? = ноль частный var _binding: FragmentHomeBinding? = ноль частная привязка val get() = _binding!! частный lateinit var SharedPreferences: SharedPreferences частный val noteViewModel: NoteViewModel от viewModels() переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) аргументы?.let { параметр1 = it.getString(ARG_PARAM1) параметр2 = it.getString(ARG_PARAM2) } } переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { // Раздуваем макет для этого фрагмента _binding = FragmentHomeBinding.inflate(инфлятор, контейнер, ложь) SharedPreferences = requireContext().getSharedPreferences("myPrefs", Context.MODE_PRIVATE) вернуть привязку.корень } сопутствующий объект { /** * Используйте этот фабричный метод для создания нового экземпляра * этот фрагмент, используя предоставленные параметры. * * @param param1 Параметр 1. * @param param2 Параметр 2. * @return Новый экземпляр фрагмента HomeFragment. */ // TODO: переименовать и изменить типы и количество параметров @JvmStatic fun newInstance(param1: String, param2: String) = HomeFragment().apply { аргументы = Bundle().apply { putString(ARG_PARAM1, параметр1) putString(ARG_PARAM2, параметр2) } } } переопределить fun onViewCreated(view: View, saveInstanceState: Bundle?) { super.onViewCreated(просмотр, сохраненныйInstanceState) привязка.tvLogout.setOnClickListener { it.findNavController().navigate(R.id.action_homeFragment_to_loginFragment) } val адаптер = NoteAdapter(requireContext(), noteViewModel, mutableListOf()) val recyclerView =binding.rvNote recyclerView.adapter = адаптер noteViewModel.allNotes.observe(viewLifecycleOwner) { примечания -> если (notes.isEmpty()) { привязка.tvDatakosong.visibility = Вид.VISIBLE привязка.rvNote.visibility = Вид.GONE } еще { привязка.tvDatakosong.visibility = Вид.GONE привязка.rvNote.visibility = Вид.VISIBLE адаптер.setNotes(заметки) } } привязка.btnTambahHome.setOnClickListener{ диалогтамба() } } веселый диалогтамба() { val builder = AlertDialog.Builder(requireContext()) val инфлатер = макетИнфлатер val диалогView = inflater.inflate(R.layout.tambah, null) builder.setView(диалогView) builder.setTitle("Данные Тамбы") builder.setPositiveButton("Добавить") { диалог, _ -> val contentEditText = диалогView.findViewById(R.id.et_judul_tambah) val titleEditText = диалогView.findViewById(R.id.et_catatan_tambah) val notecontent = contentEditText.text.toString() val titlenote = titleEditText.text.toString() if (notecontent.isNotEmpty() && titlenote.isNotEmpty()) { val newNote = Note(note = notecontent, title = titlenote) noteViewModel.insert(newNote) } } } } это noteviewmodel
пакет com.example.challenge4binar импортировать androidx.lifecycle.LiveData импортировать androidx.lifecycle.ViewModel импортировать androidx.lifecycle.viewModelScope импортировать kotlinx.coroutines.launch класс NoteViewModel (частный репозиторий val: NoteRepository): ViewModel () { val allNotes: LiveData =repository.allNotes забавная вставка (примечание: Примечание) = viewModelScope.launch { репозиторий.insert(примечание) } забавное обновление (примечание: Примечание) = viewModelScope.launch { репозиторий.обновление (примечание) } весело удалить (примечание: Примечание) = viewModelScope.launch { репозиторий.delete (примечание) } } это noteRepository
пакет com.example.challenge4binar импортировать androidx.lifecycle.LiveData класс NoteRepository(private val noteDao: NoteDao) { val allNotes: LiveData = noteDao.getAllNotes() приостановить забавную вставку (примечание: Примечание) { noteDao.insert(примечание) } приостановить забавное обновление (примечание: Примечание) { noteDao.update(примечание) } приостановить веселье удалить (примечание:Примечание){ noteDao.delete(примечание) } } это Примечание
@Entity(tableName = "notes") класс данных Примечание( @PrimaryKey(autoGenerate = true)val id:Long = 0, вар заголовок:Строка, вар примечание:Строка ) а это адаптер для заметок
пакет com.example.challenge4binar импортировать android.app.AlertDialog импортировать android.content.Context импортировать android.view.LayoutInflater импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.Button импортировать android.widget.EditText импортировать android.widget.ImageView импортировать androidx.recyclerview.widget.RecyclerView класс NoteAdapter( частный контекст val: Контекст, частный val noteViewModel: NoteViewModel, частные примечания val: MutableList):RecyclerView.Adapter() { внутренний класс ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) { val deleteButton: ImageView = itemView.findViewById(R.id.btn_delete_rv) val updateButton: ImageView = itemView.findViewById(R.id.btn_update_rv) забавная связка (примечание: Примечание) { deleteButton.setOnClickListener { диалогхапус (примечание) } updateButton.setOnClickListener { диалоговое обновление (примечание) } } } переопределить удовольствие onCreateViewHolder (родитель: ViewGroup, viewType: Int): NoteAdapter.ViewHolder { val itemView = LayoutInflater.from(parent.context).inflate(R.layout.delete, родительский, false) вернуть ViewHolder (itemView) } переопределить удовольствие onBindViewHolder(держатель: NoteAdapter.ViewHolder, позиция: Int) { val note = примечания[позиция] держатель.bind (примечание) } переопределить удовольствие getItemCount(): Int { вернуть примечания.размер } частный забавный диалогхапус (примечание: Примечание) { val builder = AlertDialog.Builder(контекст) builder.setTitle("Удалить заметку") builder.setPositiveButton("Delete") { диалог, _ -> noteViewModel.delete (примечание) val позиция = примечания.indexOf(примечание) если (позиция != -1) { примечания.removeAt(позиция) notifyItemRemoved (позиция) } диалог.отклонить() } builder.setNegativeButton("Отмена") { диалог, _ -> диалог.отклонить() } строитель.шоу() } частный диалог обновления (примечание: Примечание) { val builder = AlertDialog.Builder(контекст) val inflater = LayoutInflater.from(контекст) val диалогView = inflater.inflate(R.layout.update, null) // Используйте var вместо val для этих переменных var etJudul = диалогView.findViewById(R.id.et_judul_edit) var etCatatan = диалогView.findViewById(R.id.et_catatan_edit) val btnInput = диалогView.findViewById(R.id.btn_edit) etJudul.setText(note.title) etCatatan.setText(note.note) builder.setView(диалогView) builder.setTitle("Примечание к обновлению") val диалог = builder.create() btnInput.setOnClickListener { // Здесь обрабатываем логику обновления val updateTitle = etJudul.text.toString() val updateNote = etCatatan.text.toString() if (updatedTitle.isNotEmpty() && updateNote.isNotEmpty()) { // Обновляем заметку новыми данными note.title = обновленный заголовок note.note = обновленноеПримечание // Вызовите здесь свой метод обновления или функцию ViewModel // Например: noteViewModel.update(note) // Закрываем диалог после завершения обновления диалог.отклонить() } еще { // Отображение сообщения об ошибке или обработка пустых полей } } диалог.шоу() } весело setNotes(newNotes: List){ примечания.очистить() примечания.addAll(новыеПримечания) } }
Мобильная версия