如何将复选框状态保存到房间数据库



我试图找到一种方法将复选框的状态保存到房间数据库中。但当我点击复选框并重新打开应用程序时,它的状态不会改变。我不知道哪里出了问题。我已经搜索了以前的问题,但找不到解决方案。下面是我的代码,谢谢。

型号类别

@Entity(tableName = "todo_table")
public class Todo {
@PrimaryKey(autoGenerate = true)
public int id;
public String title;
public Boolean isChecked;
public Todo(String title, Boolean isChecked) {
this.title = title;
this.isChecked = isChecked;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Boolean getChecked() {
return isChecked;
}
public void setChecked(Boolean checked) {
isChecked = checked;
}
}

DAO

@Dao
public interface TodoDAO {
@Insert
void Insert(Todo todo);

@Update
void Update(Todo todo);
@Query("SELECT * FROM todo_table ORDER BY id ASC")
LiveData<List<Todo>> getAllTodo();
}

TodoDatabase

@Database(entities = Todo.class,version = 1,exportSchema = false)
public abstract class TodoDatabase extends RoomDatabase {
private static TodoDatabase instance;
public abstract TodoDAO todoDAO();
public static synchronized TodoDatabase getInstance(Context context){
if(instance == null){
instance = Room.databaseBuilder(context.getApplicationContext(),
TodoDatabase.class,"todo_database").fallbackToDestructiveMigration()
.addCallback(roomCallBack)
.build();
}
return instance;
}
private static  RoomDatabase.Callback roomCallBack = new RoomDatabase.Callback(){
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
new PopulateDbAsyncTask(instance).execute();
}
};
private static class PopulateDbAsyncTask extends AsyncTask<Void,Void,Void> {
private TodoDAO todoDAO;
private PopulateDbAsyncTask(TodoDatabase database) {
todoDAO = database.todoDAO();
}
@Override
protected Void doInBackground(Void... voids) {
return null;
}
}
}

TodoRepository

public class TodoRepository {
private TodoDAO todoDAO;
private LiveData<List<Todo>> todo;
public TodoRepository(Application application){
TodoDatabase database = TodoDatabase.getInstance(application);
todoDAO = database.todoDAO();
todo = todoDAO.getAllTodo();
}
public void insert(Todo todo){
new InsertNoteAsyncTask(todoDAO).execute(todo);
}
public LiveData<List<Todo>> getTodo() {
return todo;
}
public void update(Todo todo){
new UpdateTodoAsyncTask(todoDAO).execute(todo);
}
private static class InsertNoteAsyncTask extends AsyncTask<Todo,Void,Void> {
private TodoDAO todoDAO;
private InsertNoteAsyncTask(TodoDAO todoDAO){
this.todoDAO = todoDAO;
}
@Override
protected Void doInBackground(Todo... todos) {
todoDAO.Insert(todos[0]);
return null;
}
}
private static class UpdateTodoAsyncTask extends AsyncTask<Todo,Void,Void> {
private TodoDAO todoDAO;
private UpdateTodoAsyncTask(TodoDAO todoDAO){
this.todoDAO = todoDAO;
}
@Override
protected Void doInBackground(Todo... todos) {
todoDAO.Update(todos[0]);
return null;
}
}
}

TodoViewModel

public class TodoViewModel extends AndroidViewModel {
private TodoRepository repository;
private LiveData<List<Todo>> todo;
public TodoViewModel(@NonNull Application application) {
super(application);
repository = new TodoRepository(application);
todo = repository.getTodo();
}
public void insert(Todo todo){
repository.insert(todo);
}
public void update(Todo todo){
repository.update(todo);
}
public LiveData<List<Todo>> getTodo(){
return todo;
}
}

TodoAdapter

public class TodoAdapter extends RecyclerView.Adapter<TodoAdapter.ViewHolder>{
private List<Todo> todos = new ArrayList<>();
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(TodoItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Todo currentTodo = todos.get(holder.getAbsoluteAdapterPosition());
holder.binding.tvTitle.setText(currentTodo.getTitle());
holder.binding.checkBox.setChecked(currentTodo.getChecked());
holder.binding.checkBox.setOnCheckedChangeListener(null);
holder.binding.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
holder.binding.checkBox.setChecked(true);
}else{
holder.binding.checkBox.setChecked(false);
}
}
});
}
@Override
public int getItemCount() {
if(todos != null){
return todos.size();
}else{
return 0;
}
}
public void setTodos(List<Todo> todos){
this.todos = todos;
notifyDataSetChanged();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TodoItemBinding binding;
public ViewHolder(TodoItemBinding bind){
super(bind.getRoot());
this.binding = bind;
}
}
}

主要活动

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private TodoItemBinding todoItemBinding;
private TodoViewModel todoViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
todoItemBinding = TodoItemBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
RecyclerView recyclerView = binding.recyclerView;
recyclerView.setLayoutManager(new LinearLayoutManager(this));
TodoAdapter todoAdapter = new TodoAdapter();
recyclerView.setAdapter(todoAdapter);
todoViewModel = new ViewModelProvider(this).get(TodoViewModel.class);
todoViewModel.getTodo().observe(this, new Observer<List<Todo>>() {
@Override
public void onChanged(List<Todo> todos) {
todoAdapter.setTodos(todos);
}
});
binding.btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addTodo();
}
});
todoItemBinding.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Boolean isChecked = todoItemBinding.checkBox.isChecked();
Todo todo;
if (isChecked){
todo = new Todo(binding.editText.getText().toString(), true);
}else{
todo = new Todo(binding.editText.getText().toString(), false);
}
todoViewModel.update(todo);
}
});
}
private void addTodo() {
String title = binding.editText.getText().toString();
Todo todo = new Todo(title,false);
todoViewModel.insert(todo);
binding.editText.setText("");
closeKeyboard();
}
private void closeKeyboard(){
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager manager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}

使用SharedPrefs将节省大量时间。更改以下代码:MainActivity内部

public void onClick(View v) {
Boolean isChecked = todoItemBinding.checkBox.isChecked();
Todo todo;
if (isChecked){
todo = new Todo(binding.editText.getText().toString(), true);
}else{
todo = new Todo(binding.editText.getText().toString(), false); }       
todoViewModel.update(todo);
}

用这个

public void onClick(View v) {
Boolean isChecked =PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean("checkBox1", false);
checkBox1.setChecked(checked);
Todo todo;
if (isChecked){
todo = new Todo(binding.editText.getText().toString(), true);
}else{
todo = new Todo(binding.editText.getText().toString(), false); }       
todoViewModel.update(todo);
}

最新更新