Java Android:将复选框状态存储在不同日期的检查表中

Java Android:将复选框状态存储在不同日期的检查表中,java,android,listview,checkbox,android-sqlite,Java,Android,Listview,Checkbox,Android Sqlite,我的应用程序是一个简单的清单。如果我单击复选框并关闭应用程序,则复选框状态将在重新启动时保存并重新加载 现在我想添加一个日历,可以用来选择日期。对于每个新的一天,列表中复选框的默认状态都应取消选中 如果复选框的状态更改,则应为此特定日期保存复选框。因此,如果我关闭应用程序并再次选择同一天,复选框状态应重新加载 如何保存复选框状态取决于日期和在listview中单击的复选框 我还可以用SharedReferences这样做吗?或者我应该使用SQLite,因为一年的使用将导致3650个已保存的复选框

我的应用程序是一个简单的清单。如果我单击复选框并关闭应用程序,则复选框状态将在重新启动时保存并重新加载

现在我想添加一个日历,可以用来选择日期。对于每个新的一天,列表中复选框的默认状态都应取消选中

如果复选框的状态更改,则应为此特定日期保存复选框。因此,如果我关闭应用程序并再次选择同一天,复选框状态应重新加载

如何保存复选框状态取决于日期和在listview中单击的复选框


我还可以用SharedReferences这样做吗?或者我应该使用SQLite,因为一年的使用将导致3650个已保存的复选框状态(假设我的检查表包含大约10项)。

以下是合乎逻辑的答案。。您需要自己实现它。

  • 使用SQLite并使表格具有所需的列(根据复选框),同时还带有日期字段

  • 现在在日期之后选择查询数据库以获得所需的日期。。如果日期存在数据,则设置复选框


    • 这里有一种方法可以实现SQLite方面的功能

      该数据库由一个包含11列的表组成

      • 一个名为/name\u date的日期列
      • 名为\u cb01\u cb02,…,\u cb10的复选框的10列
      数据库helperDBHelper.java(SQLiteOpenHelper类的一个子类)具有必需的/overidden属性

      • onCreate(创建数据库时运行一次)和
      • onUpgrade(如果数据库版本号增加,则运行,注意不执行任何操作)
      • 它有一个只需要上下文的构造函数(因此在使用它的活动中
        mDB=newdbhelper(this);
      • 它有一种方法可以添加一行
        addNewDayEntry
        ,该方法添加未标记为正在设置复选框的行
      • 它有一个更新日期复选框(1-10)的方法
      • 它有一种方法可以检查是否为指定日期设置了复选框
        isDayEntryCheckboxSet
      • 有一个私有方法用于检索复选框(1-10)的相应列名,即
        getCheckboxColumnNameFromNumber
      代码是:-

      public class DBHelper extends SQLiteOpenHelper {
      
          public static final String DBNAME = "mydb";
          public static final int DBVERSION = 1;
          public static final String TB_DAYENTRIES = "day_entries";
          public static final String DAYENTRIES_COL_DATE = "_date";
          public static final String DAYENTRIES_COL_CB01 = "_cb01";
          public static final String DAYENTRIES_COL_CB02 = "_cb02";
          public static final String DAYENTRIES_COL_CB03 = "_cb03";
          public static final String DAYENTRIES_COL_CB04 = "_cb04";
          public static final String DAYENTRIES_COL_CB05 = "_cb05";
          public static final String DAYENTRIES_COL_CB06 = "_cb06";
          public static final String DAYENTRIES_COL_CB07 = "_cb07";
          public static final String DAYENTRIES_COL_CB08 = "_cb08";
          public static final String DAYENTRIES_COL_CB09 = "_cb09";
          public static final String DAYENTRIES_COL_CB10 = "_cb10";
      
      
          SQLiteDatabase mDB;
          public DBHelper(Context context) {
              super(context, DBNAME, null, DBVERSION);
              mDB = this.getWritableDatabase();
          }
      
          @Override
          public void onCreate(SQLiteDatabase db) {
              String crt_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TB_DAYENTRIES + "(" +
                      DAYENTRIES_COL_DATE + " TEXT PRIMARY KEY NOT NULL," +
                      DAYENTRIES_COL_CB01 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB02 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB03 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB04 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB05 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB06 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB07 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB08 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB09 + " INTEGER DEFAULT 0," +
                      DAYENTRIES_COL_CB10 + " INTEGER DEFAULT 0" +
                      ")";
              db.execSQL(crt_tbl_sql);
      
          }
      
          @Override
          public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
      
          }
      
          public long addNewDayEntry(String date) {
              ContentValues cv = new ContentValues();
              cv.put(DAYENTRIES_COL_DATE,date);
              return mDB.insert(TB_DAYENTRIES,null,cv);
          }
      
          public int setDayEntryForOneCheckBox(String date, int checkbox) {
              int rv = 0;
              String whereclause = DAYENTRIES_COL_DATE + "=?";
              String[] whereargs = new String[]{date};
              ContentValues cv = new ContentValues();
              switch (checkbox) {
                  case 1:
                      cv.put(DAYENTRIES_COL_CB01,1);
                      break;
                  case 2:
                      cv.put(DAYENTRIES_COL_CB02,1);
                      break;
                  case 3:
                      cv.put(DAYENTRIES_COL_CB03,1);
                      break;
                  case 4:
                      cv.put(DAYENTRIES_COL_CB04,1);
                      break;
                  case 5:
                      cv.put(DAYENTRIES_COL_CB05,1);
                      break;
                  case 6:
                      cv.put(DAYENTRIES_COL_CB06,1);
                      break;
                  case 7:
                      cv.put(DAYENTRIES_COL_CB07,1);
                      break;
                  case 8:
                      cv.put(DAYENTRIES_COL_CB08,1);
                      break;
                  case 9:
                      cv.put(DAYENTRIES_COL_CB09,1);
                      break;
                  case 10:
                      cv.put(DAYENTRIES_COL_CB10,1);
                      break;
              }
              if (cv.size() == 1) {
                  rv = mDB.update(TB_DAYENTRIES,cv,whereclause,whereargs);
              }
              return rv;
          }
      
          public boolean isDayEntryCheckboxSet(String date, int checkbox) {
              boolean rv = false;
              String whereclause = DAYENTRIES_COL_DATE + "=?";
              String[] whereargs = new String[]{date};
              if (checkbox < 1 || checkbox > 10) {
                  return rv;
              }
              Cursor csr = mDB.query(TB_DAYENTRIES,null,whereclause,whereargs,null,null,null);
              if (csr.moveToFirst()) {
                  rv = csr.getInt(csr.getColumnIndex(getCheckboxColumnNameFromNumber(checkbox))) == 1;
              }
              csr.close();
              return rv;
          }
      
          private String getCheckboxColumnNameFromNumber(int checkbox) {
              switch (checkbox) {
                  case 1:
                      return DAYENTRIES_COL_CB01;
                  case 2:
                      return DAYENTRIES_COL_CB02;
                  case 3:
                      return DAYENTRIES_COL_CB03;
                  case 4:
                      return DAYENTRIES_COL_CB04;
                  case 5:
                      return DAYENTRIES_COL_CB05;
                  case 6:
                      return DAYENTRIES_COL_CB06;
                  case 7:
                      return DAYENTRIES_COL_CB07;
                  case 8:
                      return DAYENTRIES_COL_CB08;
                  case 9:
                      return DAYENTRIES_COL_CB09;
                  case 10:
                      return DAYENTRIES_COL_CB10;
              }
              return "";
          }
      }
      
      public class MainActivity extends AppCompatActivity {
      
          DBHelper mDB;
          String[] checkdates = new String[]{"2018-09-10","2018-09-11","2018-09-09"};
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              mDB = new DBHelper(this);
      
              mDB.addNewDayEntry("2018-09-10");
              mDB.setDayEntryForOneCheckBox("2018-09-10",1);
              mDB.setDayEntryForOneCheckBox("2018-09-10",3);
              mDB.setDayEntryForOneCheckBox("2018-09-10",8);
              mDB.setDayEntryForOneCheckBox("2010-09-09",7); //<<<<<<<<<< wont set as DAY ENTRY NOT ADDED
      
              StringBuilder sb = new StringBuilder("");
              for (String s: checkdates) {
                  sb.append("\nChecking Date ").append(s);
                  for(int i=1; i <= 10; i++) {
                      sb.append("\n\tCHECKBOX ").append(String.valueOf(i)).append(" IS ").append(String.valueOf(mDB.isDayEntryCheckboxSet(s,i)));
                  }
              }
              Log.d("CHECKBOX STATES",sb.toString());
          }
      } 
      
      产出为:-

      10-01 10:17:46.753 1467-1467/? D/CHECKBOX STATES: Checking Date 2018-09-10
              CHECKBOX 1 IS true
              CHECKBOX 2 IS false
              CHECKBOX 3 IS true
              CHECKBOX 4 IS false
              CHECKBOX 5 IS false
              CHECKBOX 6 IS false
              CHECKBOX 7 IS false
              CHECKBOX 8 IS true
              CHECKBOX 9 IS false
              CHECKBOX 10 IS false
          Checking Date 2018-09-11
              CHECKBOX 1 IS false
              CHECKBOX 2 IS false
              CHECKBOX 3 IS false
              CHECKBOX 4 IS false
              CHECKBOX 5 IS false
              CHECKBOX 6 IS false
              CHECKBOX 7 IS false
              CHECKBOX 8 IS false
              CHECKBOX 9 IS false
              CHECKBOX 10 IS false
          Checking Date 2018-09-09
              CHECKBOX 1 IS false
              CHECKBOX 2 IS false
              CHECKBOX 3 IS false
              CHECKBOX 4 IS false
              CHECKBOX 5 IS false
              CHECKBOX 6 IS false
              CHECKBOX 7 IS false
              CHECKBOX 8 IS false
              CHECKBOX 9 IS false
              CHECKBOX 10 IS false
      
      • 注释
      • 2018-09-10和2018-09-09的所有复选框均为假,因为未添加这些日期(天)的条目

      • mDB.setDayEntryForOneCheckBox(“2010-09-09”,7)// 从MikeT的回答继续,下面是如何进行ListView,并在选中复选框时使其更改基础数据

        您需要将ListView添加到主布局中,例如:-

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">
        
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!" />
            <ListView
                android:id="@+id/cblist"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
            </ListView>
        </LinearLayout>
        
        • 这是CBTag.java
        需要一个自定义适配器,它将为列表中的每个项目使用上述布局,它还将使用CBTag对象为复选框设置标记

        public class CBListAdapter extends CursorAdapter {
        
            private Context mContext;
            private DBHelper mDB;
        
            public CBListAdapter(Context context, Cursor cursor) {
                super(context,cursor,0);
                mContext = context;
                mDB = new DBHelper(mContext);
            }
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                return  super.getView(position,convertView,parent);
            }
        
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
                return LayoutInflater.from(mContext).inflate(R.layout.cblist_item,viewGroup,false);
            }
        
            @Override
            public void bindView(View view, Context context, Cursor csr) {
        
                TextView entrydate = view.findViewById(R.id.entrydate);
                String entry_date = csr.getString(csr.getColumnIndex(DBHelper.DAYENTRIES_COL_DATE));
                entrydate.setText(entry_date);
        
        
                CheckBox[] cblist = new CheckBox[]{
                        view.findViewById(R.id.cb01),
                        view.findViewById(R.id.cb02),
                        view.findViewById(R.id.cb03),
                        view.findViewById(R.id.cb04),
                        view.findViewById(R.id.cb05),
                        view.findViewById(R.id.cb06),
                        view.findViewById(R.id.cb07),
                        view.findViewById(R.id.cb08),
                        view.findViewById(R.id.cb09),
                        view.findViewById(R.id.cb10)
                };
                // For Each CheckBox set the tag as a CBTag object (Holds String for date and int for CheckBox #)
                // Also add an onClick Listener that will update the applicable row/column and
                // refresh the ListView
                int cbidx = 0;
                for (CheckBox c: cblist) {
                    c.setChecked(csr.getInt(cbidx + 1) == 1);
                    c.setTag(new CBTag(entry_date,cbidx + 1));
                    c.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            CBTag cbtag = (CBTag) view.getTag();
                            mDB.setDayEntryForOneCheckBox(
                                    cbtag.getEntrydate(),
                                    cbtag.getCheckBoxNumber(),
                                    ((CheckBox)view).isChecked()
                            );
                            ((MainActivity) mContext).refreshDateEntryList();
                        }
                    });
                    cbidx++;
                }
            }
        }
        
        对DatabaseHelper进行了一些更改,现在是这样的

        public class DBHelper extends SQLiteOpenHelper {
        
            public static final String DBNAME = "mydb";
            public static final int DBVERSION = 1;
            public static final String TB_DAYENTRIES = "day_entries";
            public static final String DAYENTRIES_COL_DATE = "_date";
            public static final String DAYENTRIES_COL_CB01 = "_cb01";
            public static final String DAYENTRIES_COL_CB02 = "_cb02";
            public static final String DAYENTRIES_COL_CB03 = "_cb03";
            public static final String DAYENTRIES_COL_CB04 = "_cb04";
            public static final String DAYENTRIES_COL_CB05 = "_cb05";
            public static final String DAYENTRIES_COL_CB06 = "_cb06";
            public static final String DAYENTRIES_COL_CB07 = "_cb07";
            public static final String DAYENTRIES_COL_CB08 = "_cb08";
            public static final String DAYENTRIES_COL_CB09 = "_cb09";
            public static final String DAYENTRIES_COL_CB10 = "_cb10";
        
        
            SQLiteDatabase mDB;
            public DBHelper(Context context) {
                super(context, DBNAME, null, DBVERSION);
                mDB = this.getWritableDatabase();
            }
        
            @Override
            public void onCreate(SQLiteDatabase db) {
                String crt_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TB_DAYENTRIES + "(" +
                        DAYENTRIES_COL_DATE + " TEXT PRIMARY KEY NOT NULL," +
                        DAYENTRIES_COL_CB01 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB02 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB03 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB04 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB05 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB06 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB07 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB08 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB09 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB10 + " INTEGER DEFAULT 0" +
                        ")";
                db.execSQL(crt_tbl_sql);
        
            }
        
            @Override
            public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        
            }
        
            public long addNewDayEntry(String date) {
                ContentValues cv = new ContentValues();
                cv.put(DAYENTRIES_COL_DATE,date);
                return mDB.insert(TB_DAYENTRIES,null,cv);
            }
        
            public Cursor getDateEntryListAsCursor() {
                String[] columns = new String[]{"*,rowid AS _id"};
                return mDB.query(TB_DAYENTRIES,columns,null,null,null,null,null);
            }
        
            public int setDayEntryForOneCheckBox(String date, int checkbox, boolean status) {
                int rv = 0;
                String whereclause = DAYENTRIES_COL_DATE + "=?";
                String[] whereargs = new String[]{date};
                ContentValues cv = new ContentValues();
                int value = 0;
                if (status) {
                    value = 1;
                }
                switch (checkbox) {
                    case 1:
                        cv.put(DAYENTRIES_COL_CB01,value);
                        break;
                    case 2:
                        cv.put(DAYENTRIES_COL_CB02,value);
                        break;
                    case 3:
                        cv.put(DAYENTRIES_COL_CB03,value);
                        break;
                    case 4:
                        cv.put(DAYENTRIES_COL_CB04,value);
                        break;
                    case 5:
                        cv.put(DAYENTRIES_COL_CB05,value);
                        break;
                    case 6:
                        cv.put(DAYENTRIES_COL_CB06,value);
                        break;
                    case 7:
                        cv.put(DAYENTRIES_COL_CB07,value);
                        break;
                    case 8:
                        cv.put(DAYENTRIES_COL_CB08,value);
                        break;
                    case 9:
                        cv.put(DAYENTRIES_COL_CB09,value);
                        break;
                    case 10:
                        cv.put(DAYENTRIES_COL_CB10,value);
                        break;
                }
                if (cv.size() == 1) {
                    rv = mDB.update(TB_DAYENTRIES,cv,whereclause,whereargs);
                }
                return rv;
            }
        
            public boolean isDayEntryCheckboxSet(String date, int checkbox) {
                boolean rv = false;
                String whereclause = DAYENTRIES_COL_DATE + "=?";
                String[] whereargs = new String[]{date};
                if (checkbox < 1 || checkbox > 10) {
                    return false;
                }
                Cursor csr = mDB.query(TB_DAYENTRIES,null,whereclause,whereargs,null,null,null);
                if (csr.moveToFirst()) {
                    rv = csr.getInt(csr.getColumnIndex(getCheckboxColumnNameFromNumber(checkbox))) == 1;
                }
                csr.close();
                return rv;
            }
        
            private String getCheckboxColumnNameFromNumber(int checkbox) {
                switch (checkbox) {
                    case 1:
                        return DAYENTRIES_COL_CB01;
                    case 2:
                        return DAYENTRIES_COL_CB02;
                    case 3:
                        return DAYENTRIES_COL_CB03;
                    case 4:
                        return DAYENTRIES_COL_CB04;
                    case 5:
                        return DAYENTRIES_COL_CB05;
                    case 6:
                        return DAYENTRIES_COL_CB06;
                    case 7:
                        return DAYENTRIES_COL_CB07;
                    case 8:
                        return DAYENTRIES_COL_CB08;
                    case 9:
                        return DAYENTRIES_COL_CB09;
                    case 10:
                        return DAYENTRIES_COL_CB10;
                }
                return "";
            }
        }
        
        • 这将在表中放入3行,并设置一些要检查的行
        看起来像这样

        选中复选框会更改复选框以及数据库中的数据


        请添加一个最小的代码示例来说明您的问题。欢迎使用堆栈溢出!其他用户将您的问题标记为低质量和需要改进。我对您的输入进行了重新措辞/格式化,使其更易于阅读/理解。请查看我的更改,以确保它们反映您的意图。但我认为你的问题仍然无法回答。你现在应该回答你的问题,包括你自己的努力(参见)。如果您有进一步的问题或反馈,请随时给我留言。我会尽快添加一些代码示例谢谢:)我会尽快尝试如何取消选中数据库中的复选框?SetDayEntryForOneCheckBox只设置一个选中的复选框,对吗?@JanMeyer正确,不过稍作修改(将指示传递为第三个参数),您只需将列更新为0即可。SQLite没有布尔类型,因此您通常会使用整数0表示false,1表示true(并非您受到限制)。您甚至可以使用1列作为整数来表示所有复选框。如果您查看Uvi答案中的修改,则已相应修改了
        SetDayEntryForOneCheckBox
        。看起来Uvi的修改设置并取消设置复选框和基础数据。
        public class CBListAdapter extends CursorAdapter {
        
            private Context mContext;
            private DBHelper mDB;
        
            public CBListAdapter(Context context, Cursor cursor) {
                super(context,cursor,0);
                mContext = context;
                mDB = new DBHelper(mContext);
            }
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                return  super.getView(position,convertView,parent);
            }
        
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
                return LayoutInflater.from(mContext).inflate(R.layout.cblist_item,viewGroup,false);
            }
        
            @Override
            public void bindView(View view, Context context, Cursor csr) {
        
                TextView entrydate = view.findViewById(R.id.entrydate);
                String entry_date = csr.getString(csr.getColumnIndex(DBHelper.DAYENTRIES_COL_DATE));
                entrydate.setText(entry_date);
        
        
                CheckBox[] cblist = new CheckBox[]{
                        view.findViewById(R.id.cb01),
                        view.findViewById(R.id.cb02),
                        view.findViewById(R.id.cb03),
                        view.findViewById(R.id.cb04),
                        view.findViewById(R.id.cb05),
                        view.findViewById(R.id.cb06),
                        view.findViewById(R.id.cb07),
                        view.findViewById(R.id.cb08),
                        view.findViewById(R.id.cb09),
                        view.findViewById(R.id.cb10)
                };
                // For Each CheckBox set the tag as a CBTag object (Holds String for date and int for CheckBox #)
                // Also add an onClick Listener that will update the applicable row/column and
                // refresh the ListView
                int cbidx = 0;
                for (CheckBox c: cblist) {
                    c.setChecked(csr.getInt(cbidx + 1) == 1);
                    c.setTag(new CBTag(entry_date,cbidx + 1));
                    c.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            CBTag cbtag = (CBTag) view.getTag();
                            mDB.setDayEntryForOneCheckBox(
                                    cbtag.getEntrydate(),
                                    cbtag.getCheckBoxNumber(),
                                    ((CheckBox)view).isChecked()
                            );
                            ((MainActivity) mContext).refreshDateEntryList();
                        }
                    });
                    cbidx++;
                }
            }
        }
        
        public class DBHelper extends SQLiteOpenHelper {
        
            public static final String DBNAME = "mydb";
            public static final int DBVERSION = 1;
            public static final String TB_DAYENTRIES = "day_entries";
            public static final String DAYENTRIES_COL_DATE = "_date";
            public static final String DAYENTRIES_COL_CB01 = "_cb01";
            public static final String DAYENTRIES_COL_CB02 = "_cb02";
            public static final String DAYENTRIES_COL_CB03 = "_cb03";
            public static final String DAYENTRIES_COL_CB04 = "_cb04";
            public static final String DAYENTRIES_COL_CB05 = "_cb05";
            public static final String DAYENTRIES_COL_CB06 = "_cb06";
            public static final String DAYENTRIES_COL_CB07 = "_cb07";
            public static final String DAYENTRIES_COL_CB08 = "_cb08";
            public static final String DAYENTRIES_COL_CB09 = "_cb09";
            public static final String DAYENTRIES_COL_CB10 = "_cb10";
        
        
            SQLiteDatabase mDB;
            public DBHelper(Context context) {
                super(context, DBNAME, null, DBVERSION);
                mDB = this.getWritableDatabase();
            }
        
            @Override
            public void onCreate(SQLiteDatabase db) {
                String crt_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TB_DAYENTRIES + "(" +
                        DAYENTRIES_COL_DATE + " TEXT PRIMARY KEY NOT NULL," +
                        DAYENTRIES_COL_CB01 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB02 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB03 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB04 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB05 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB06 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB07 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB08 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB09 + " INTEGER DEFAULT 0," +
                        DAYENTRIES_COL_CB10 + " INTEGER DEFAULT 0" +
                        ")";
                db.execSQL(crt_tbl_sql);
        
            }
        
            @Override
            public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        
            }
        
            public long addNewDayEntry(String date) {
                ContentValues cv = new ContentValues();
                cv.put(DAYENTRIES_COL_DATE,date);
                return mDB.insert(TB_DAYENTRIES,null,cv);
            }
        
            public Cursor getDateEntryListAsCursor() {
                String[] columns = new String[]{"*,rowid AS _id"};
                return mDB.query(TB_DAYENTRIES,columns,null,null,null,null,null);
            }
        
            public int setDayEntryForOneCheckBox(String date, int checkbox, boolean status) {
                int rv = 0;
                String whereclause = DAYENTRIES_COL_DATE + "=?";
                String[] whereargs = new String[]{date};
                ContentValues cv = new ContentValues();
                int value = 0;
                if (status) {
                    value = 1;
                }
                switch (checkbox) {
                    case 1:
                        cv.put(DAYENTRIES_COL_CB01,value);
                        break;
                    case 2:
                        cv.put(DAYENTRIES_COL_CB02,value);
                        break;
                    case 3:
                        cv.put(DAYENTRIES_COL_CB03,value);
                        break;
                    case 4:
                        cv.put(DAYENTRIES_COL_CB04,value);
                        break;
                    case 5:
                        cv.put(DAYENTRIES_COL_CB05,value);
                        break;
                    case 6:
                        cv.put(DAYENTRIES_COL_CB06,value);
                        break;
                    case 7:
                        cv.put(DAYENTRIES_COL_CB07,value);
                        break;
                    case 8:
                        cv.put(DAYENTRIES_COL_CB08,value);
                        break;
                    case 9:
                        cv.put(DAYENTRIES_COL_CB09,value);
                        break;
                    case 10:
                        cv.put(DAYENTRIES_COL_CB10,value);
                        break;
                }
                if (cv.size() == 1) {
                    rv = mDB.update(TB_DAYENTRIES,cv,whereclause,whereargs);
                }
                return rv;
            }
        
            public boolean isDayEntryCheckboxSet(String date, int checkbox) {
                boolean rv = false;
                String whereclause = DAYENTRIES_COL_DATE + "=?";
                String[] whereargs = new String[]{date};
                if (checkbox < 1 || checkbox > 10) {
                    return false;
                }
                Cursor csr = mDB.query(TB_DAYENTRIES,null,whereclause,whereargs,null,null,null);
                if (csr.moveToFirst()) {
                    rv = csr.getInt(csr.getColumnIndex(getCheckboxColumnNameFromNumber(checkbox))) == 1;
                }
                csr.close();
                return rv;
            }
        
            private String getCheckboxColumnNameFromNumber(int checkbox) {
                switch (checkbox) {
                    case 1:
                        return DAYENTRIES_COL_CB01;
                    case 2:
                        return DAYENTRIES_COL_CB02;
                    case 3:
                        return DAYENTRIES_COL_CB03;
                    case 4:
                        return DAYENTRIES_COL_CB04;
                    case 5:
                        return DAYENTRIES_COL_CB05;
                    case 6:
                        return DAYENTRIES_COL_CB06;
                    case 7:
                        return DAYENTRIES_COL_CB07;
                    case 8:
                        return DAYENTRIES_COL_CB08;
                    case 9:
                        return DAYENTRIES_COL_CB09;
                    case 10:
                        return DAYENTRIES_COL_CB10;
                }
                return "";
            }
        }
        
        public class MainActivity extends AppCompatActivity {
        
            DBHelper mDB;
            ListView mLV;
            CBListAdapter mCBLA;
            Cursor mCsr;
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                mDB  = new DBHelper(this);
                loadInitialData();
                mCsr = mDB.getDateEntryListAsCursor();
                mLV = this.findViewById(R.id.cblist);
                mCBLA = new CBListAdapter(this,mCsr);
                mLV.setAdapter(mCBLA);
            }
        
            protected void onResume() {
                super.onResume();
                refreshDateEntryList();
            }
        
            public void refreshDateEntryList() {
                mCsr = mDB.getDateEntryListAsCursor();
                mCBLA.swapCursor(mCsr);
            }
        
            private void loadInitialData() {
                long rowcount = DatabaseUtils.queryNumEntries(mDB.getWritableDatabase(),DBHelper.TB_DAYENTRIES);
                if (rowcount > 0) return;
                String[] dates_to_add = new String[]{"2018-09-09","2018-09-10","2018-09-11"};
                for (String s: dates_to_add) {
                    mDB.addNewDayEntry(s);
                }
                mDB.setDayEntryForOneCheckBox("2018-09-10",3,true);
                mDB.setDayEntryForOneCheckBox("2018-09-09",9,true);
            }
        }