当前位置: 首页 > 知识库问答 >
问题:

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

谯灿
2023-03-14

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

@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
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();

}
@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;
        }
    }
}
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;
        }
    }
}
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);
        }
    }
}

共有1个答案

马安邦
2023-03-14

使用SharedPrefs可以节省大量时间。更改以下代码:InsideMainActivity

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);
}
 类似资料:
  • 我正在开发一个android烹饪应用程序(使用java),主页有一个回收器视图,其中填充了用户可以喜欢的食谱(类似于FaceBook帖子)。喜欢按钮是一个复选框,保存每个食谱的喜欢复选框状态的最佳方式是什么,所以当用户退出应用程序并再次登录时,他们不会多次喜欢同一个食谱。 在这种情况下,使用SharedReference是一个好主意吗? **im使用MySql作为数据库,不使用firebase。

  • 问题内容: 当我选中复选框时,我需要一些js / ajax / jquery脚本将数据动态保存到数据库中。复选框或当前加载到记录旁边的复选框,并根据是否选中变量来更改数据库中的变量。但是我必须在选择一个页面以将其保存到数据库后重新加载页面。我可以做其他所有事情,但了解如何对此实现ajax,因此我不必每次都提交查询并刷新页面。任何帮助是极大的赞赏。 问题答案: 使用jQuery来做,一个简单的例子可

  • 如果我打开活动,复选框始终保持选中状态,即使我取消选中它并离开活动或关闭应用程序,在重新启动活动后,它也将保持选中状态。 我已尝试使用以下代码段保存活动的状态。 复选框应始终处于用户离开它的状态(选中或未选中)。

  • 我需要你的帮助。我试图在没有反序列化的情况下找到解决方案,但我什么也没找到。如果你能帮我就好了...所以我有了下面的JSON文件 谢谢你的时间和帮助。 我有以下错误:

  • 问题内容: 我有一个带有简单复选框的应用程序,当用户按下该复选框时,会在build.prop中添加一行,这是可行的,但是当我退出该应用程序时,该复选框已重置,有没有一种方法可以通过在其中添加示例代码来防止这种情况您的帖子,因为我仍然是Android应用程序的新手。 MainActivity.java activity_main.xml 问题答案: 使用getRuntime()。exec()在哪里得

  • 我试图做的是,当按下主菜单上的按钮时,将设置菜单拉上(设置菜单作为独立于主菜单的活动实现)。为了简单起见,假设我的主菜单是空的,只有一个按钮打开设置菜单。在设置菜单中,有一个复选框和一个返回到主活动的“完成”按钮。 如何保存复选框并加载它(代码应该是什么,应该放在哪里,为什么等等)?我试着用谷歌搜索它,并试图复制结果,但我似乎无法得到它。到目前为止发生了两件事:没有保存任何内容,或者我的程序崩溃。