title: How to save a checkbox state in database?
body: <p>I am trying to save a checkbox state in my database and retrieve it later but it doesn't seem to work.  I get now errors in my log and am hoping some one would be able to assist.</p>
  
  <p>Here is my code for my checkbox:</p>
  
  <pre><code> &lt;CheckBox
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/check1"
          android:text="test"
          android:layout_below="@+id/textViewAge"
          android:layout_alignParentLeft="true"
          android:layout_alignParentStart="true"
          android:layout_marginTop="15dp" /&gt;
  
      &lt;CheckBox
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/check2"
          android:text="test2"
          android:layout_below="@+id/check1"
          android:layout_alignParentLeft="true"
          android:layout_alignParentStart="true"
          android:layout_marginTop="11dp" /&gt;
  </code></pre>
  
  <p>Then in my CreateOrEditJobCards.java:</p>
  
  <pre><code>checkA = (CheckBox) findViewById(R.id.check1);
      checkA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  
          @Override
          public void onCheckedChanged(CompoundButton arg0, boolean checked) {
              // TODO Auto-generated method stub
              if(checked)
              {
                  SaveString="Yes";
              }
              else
              {
                  SaveString="No";
              }
          }
      });
      checkB = (CheckBox) findViewById(R.id.check2);
      checkB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  
          @Override
          public void onCheckedChanged(CompoundButton arg0, boolean checked) {
              // TODO Auto-generated method stub
              if(checked)
              {
                  SaveStringA="Yes";
              }
              else
              {
                  SaveStringA="No";
              }
          }
      });
  
  ......
  
  if(personID &gt; 0) {
          saveButton.setVisibility(View.GONE);
          buttonLayout.setVisibility(View.VISIBLE);
  
          Cursor rs = dbHelper.getPerson(personID);
          rs.moveToFirst();
          String personName = rs.getString(rs.getColumnIndex(DBHelper.PERSON_COLUMN_NAME));
          String personGender = rs.getString(rs.getColumnIndex(DBHelper.PERSON_COLUMN_GENDER));
          SaveString = rs.getString(rs.getColumnIndex(DBHelper.PERSON_CHECKBOX_A));
          SaveStringA = rs.getString(rs.getColumnIndex(DBHelper.PERSON_CHECKBOX_B));
          int personAge = rs.getInt(rs.getColumnIndex(DBHelper.PERSON_COLUMN_AGE));
          if (!rs.isClosed()) {
              rs.close();
          }
  
          nameEditText.setText(personName);
          nameEditText.setFocusable(false);
          nameEditText.setClickable(false);
  
          genderEditText.setText(personGender);
          genderEditText.setFocusable(false);
          genderEditText.setClickable(false);
  
          ageEditText.setText((personAge + ""));
          ageEditText.setFocusable(false);
          ageEditText.setClickable(false);
  
          checkA.setChecked(Boolean.parseBoolean(String.valueOf(SaveString)));
          checkA.setFocusable(false);
          checkA.setClickable(false);
  
          checkB.setChecked(Boolean.parseBoolean(String.valueOf(SaveStringA)));
          checkB.setFocusable(false);
          checkB.setClickable(false);
      }
  }
  
  @Override
  public void onClick(View view) {
      switch (view.getId()) {
          case R.id.saveButton:
              persistPerson();
              return;
          case R.id.editButton:
              saveButton.setVisibility(View.VISIBLE);
              buttonLayout.setVisibility(View.GONE);
              nameEditText.setEnabled(true);
              nameEditText.setFocusableInTouchMode(true);
              nameEditText.setClickable(true);
  
              genderEditText.setEnabled(true);
              genderEditText.setFocusableInTouchMode(true);
              genderEditText.setClickable(true);
  
              ageEditText.setEnabled(true);
              ageEditText.setFocusableInTouchMode(true);
              ageEditText.setClickable(true);
  
              checkA.setEnabled(true);
              checkA.setFocusableInTouchMode(true);
              checkA.setClickable(true);
  
              checkB.setEnabled(true);
              checkB.setFocusableInTouchMode(true);
              checkB.setClickable(true);
  
  
              return;
          case R.id.deleteButton:
              AlertDialog.Builder builder = new AlertDialog.Builder(this);
              builder.setMessage(R.string.deletePerson)
                      .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                          public void onClick(DialogInterface dialog, int id) {
                              dbHelper.deletePerson(personID);
                              Toast.makeText(getApplicationContext(), "Deleted Successfully", Toast.LENGTH_SHORT).show();
                              Intent intent = new Intent(getApplicationContext(), JobCardMainActivity.class);
                              intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                              startActivity(intent);
                          }
                      })
                      .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                          public void onClick(DialogInterface dialog, int id) {
                              // User cancelled the dialog
                          }
                      });
              AlertDialog d = builder.create();
              d.setTitle("Delete Job Card?");
              d.show();
              return;
      }
  }
  
  public void persistPerson() {
      if(personID &gt; 0) {
          if(dbHelper.updatePerson(personID,
                  nameEditText.getText().toString(),
                  genderEditText.getText().toString(),
                  checkA.getText().toString(),
                  checkB.getText().toString(),
  
                  Integer.parseInt(ageEditText.getText().toString()))) {
  
              Toast.makeText(getApplicationContext(), "Job Card Update Successful", Toast.LENGTH_SHORT).show();
              Intent intent = new Intent(getApplicationContext(), JobCardMainActivity.class);
              intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
              startActivity(intent);
          }
          else {
              Toast.makeText(getApplicationContext(), "Job Card Update Failed", Toast.LENGTH_SHORT).show();
          }
      }
      else {
          if(dbHelper.insertPerson(nameEditText.getText().toString(),
                  genderEditText.getText().toString(),
                  checkA.getText().toString(),
                  checkB.getText().toString(),
  
                  Integer.parseInt(ageEditText.getText().toString()))) {
              Toast.makeText(getApplicationContext(), "Job Card Inserted", Toast.LENGTH_SHORT).show();
          }
          else{
              Toast.makeText(getApplicationContext(), "Could not Insert Job Card", Toast.LENGTH_SHORT).show();
          }
          Intent intent = new Intent(getApplicationContext(), JobCardMainActivity.class);
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
          startActivity(intent);
      }
  }
  }
  </code></pre>
  
  <p>And in my DBHelper.java</p>
  
  <pre><code>public static final String PERSON_TABLE_NAME = "person";
  public static final String PERSON_COLUMN_ID = "_id";
  public static final String PERSON_COLUMN_NAME = "name";
  public static final String PERSON_COLUMN_GENDER = "gender";
  public static final String PERSON_COLUMN_AGE = "age";
  public static final String PERSON_CHECKBOX_A = "checka";
  public static final String PERSON_CHECKBOX_B = "checkb";
  
  public DBHelper(Context context) {
      super(context, DATABASE_NAME , null, DATABASE_VERSION);
  }
  
  @Override
  public void onCreate(SQLiteDatabase db) {
      db.execSQL(
              "CREATE TABLE " + PERSON_TABLE_NAME +
                      "(" + PERSON_COLUMN_ID + " INTEGER PRIMARY KEY, " +
                      PERSON_COLUMN_NAME + " TEXT, " +
                      PERSON_COLUMN_GENDER + " TEXT, " +
                      PERSON_CHECKBOX_A + " TEXT, " +
                      PERSON_CHECKBOX_B + " TEXT, " +
                      PERSON_COLUMN_AGE + " INTEGER)"
      );
  }
  
  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      db.execSQL("DROP TABLE IF EXISTS " + PERSON_TABLE_NAME);
      onCreate(db);
  }
  
  public boolean insertPerson(String name,
                              String gender,
                              String checka,
                              String checkb,
                              int age) {
  
      SQLiteDatabase db = this.getWritableDatabase();
      ContentValues contentValues = new ContentValues();
  
      contentValues.put(PERSON_COLUMN_NAME, name);
      contentValues.put(PERSON_COLUMN_GENDER, gender);
      contentValues.put(PERSON_COLUMN_AGE, age);
      contentValues.put(PERSON_CHECKBOX_A, checka);
      contentValues.put(PERSON_CHECKBOX_B, checkb);
  
      db.insert(PERSON_TABLE_NAME, null, contentValues);
      return true;
  }
  
  public int numberOfRows() {
      SQLiteDatabase db = this.getReadableDatabase();
      int numRows = (int) DatabaseUtils.queryNumEntries(db, PERSON_TABLE_NAME);
      return numRows;
  }
  
  public boolean updatePerson(Integer id,
                              String name,
                              String gender,
                              String checka,
                              String checkb,
                              int age) {
      SQLiteDatabase db = this.getWritableDatabase();
      ContentValues contentValues = new ContentValues();
      contentValues.put(PERSON_COLUMN_NAME, name);
      contentValues.put(PERSON_COLUMN_GENDER, gender);
      contentValues.put(PERSON_COLUMN_AGE, age);
      contentValues.put(PERSON_CHECKBOX_A, checka);
      contentValues.put(PERSON_CHECKBOX_B, checkb);
      db.update(PERSON_TABLE_NAME, contentValues, PERSON_COLUMN_ID + " = ? ", new String[] { Integer.toString(id) } );
      return true;
  }
  
  public Integer deletePerson(Integer id) {
      SQLiteDatabase db = this.getWritableDatabase();
      return db.delete(PERSON_TABLE_NAME,
              PERSON_COLUMN_ID + " = ? ",
              new String[] { Integer.toString(id) });
  }
  
  public Cursor getPerson(int id) {
      SQLiteDatabase db = this.getReadableDatabase();
      Cursor res =  db.rawQuery("SELECT * FROM " + PERSON_TABLE_NAME + " WHERE " +
              PERSON_COLUMN_ID + "=?", new String[]{Integer.toString(id)});
      return res;
  }
  
  public Cursor getAllPersons() {
      SQLiteDatabase db = this.getReadableDatabase();
      Cursor res =  db.rawQuery( "SELECT * FROM " + PERSON_TABLE_NAME, null );
      return res;
  }
  }
  </code></pre>
  
  <p>Basically in this app the user would select "add new jobcard" then would fill in the form and hit save.  This then is displayed in a list view in number order.
  When the user would then select the form created earlier they can then hit send and it will then email the form (I am still working on that and code is not in above)</p>
  
  <p>However like I said earlier, everything else in the form works and saves but can't seem to get the checkbox to save the state it was checked</p>
  
  <p>Could some one please have a look at mu code and point out where I have gone wrong and assist?</p>
  
  <p>Thanks</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>Log Output:</p>
  
  <pre><code>10-29 10:37:13.329 11748-11825/com.software.example D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2560]-format:1
  10-29 10:37:13.331 11748-11748/com.software.example D/ScrollView:  onsize change changed 
  10-29 10:37:13.367 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1
  10-29 10:37:13.367 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: MSG_WINDOW_FOCUS_CHANGED 1
  10-29 10:37:13.370 11748-11748/com.software.example V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@3e5e501 nm : com.software.example ic=com.android.internal.widget.EditableInputConnection@46effa6
  10-29 10:37:13.370 11748-11748/com.software.example I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
  10-29 10:37:13.380 11748-11748/com.software.example D/InputTransport: Input channel constructed: fd=96
  10-29 10:37:13.380 11748-11748/com.software.example D/InputTransport: Input channel destroyed: fd=91
  10-29 10:37:13.406 11748-11825/com.software.example D/OpenGLRenderer: endAllActiveAnimators on 0x7cfa738000 (RippleDrawable) with handle 0x7cfea52600
  10-29 10:37:13.536 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: MSG_RESIZED: ci=Rect(0, 96 - 0, 1128) vi=Rect(0, 96 - 0, 1128) or=1
  10-29 10:37:13.557 11748-11748/com.software.example D/ScrollView:  onsize change changed 
  10-29 10:37:14.180 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 0
  10-29 10:37:14.261 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 1
  10-29 10:37:15.057 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 0
  10-29 10:37:15.156 11748-11748/com.software.exampleD/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 1
  10-29 10:37:15.807 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 0
  10-29 10:37:15.975 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 1
  10-29 10:37:16.544 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 0
  10-29 10:37:16.619 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: ViewPostImeInputStage processPointer 1
  10-29 10:37:16.697 11748-11748/com.software.example D/InputTransport: Input channel constructed: fd=87
  10-29 10:37:16.698 11748-11748/com.software.example D/ViewRootImpl@89b4657[Toast]: setView = android.widget.LinearLayout{7d5a544 V.E...... ......I. 0,0-0,0} touchMode=true
  10-29 10:37:16.710 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: MSG_WINDOW_FOCUS_CHANGED 0
  10-29 10:37:16.712 11748-11748/com.software.example D/ViewRootImpl@a20a45c[JobCardMainActivity]: dispatchDetachedFromWindow
  10-29 10:37:16.716 11748-11748/com.software.example D/InputTransport: Input channel destroyed: fd=88
  10-29 10:37:16.735 11748-11825/com.software.example D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [652x176]-format:1
  10-29 10:37:16.752 11748-11748/com.software.example D/AbsListView: Get MotionRecognitionManager
  10-29 10:37:16.753 11748-11748/com.software.example D/MotionRecognitionManager: mSContextService = com.samsung.android.hardware.context.ISemContextService$Stub$Proxy@17a4e86
  10-29 10:37:16.753 11748-11748/com.software.example D/MotionRecognitionManager: motionService = com.samsung.android.gesture.IMotionRecognitionService$Stub$Proxy@6a47347
  10-29 10:37:16.753 11748-11748/com.software.example D/MotionRecognitionManager: motionService = com.samsung.android.gesture.IMotionRecognitionService$Stub$Proxy@6a47347
  10-29 10:37:16.776 11748-11748/com.software.example D/InputTransport: Input channel constructed: fd=95
  10-29 10:37:16.776 11748-11748/com.software.example D/ViewRootImpl@3e9255b[JobCardMainActivity]: setView = DecorView@308d1f8[JobCardMainActivity] touchMode=true
  10-29 10:37:16.836 11748-11825/com.software.example D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2560]-format:1
  10-29 10:37:16.837 11748-11748/com.software.example D/AbsListView:  onsize change 
  10-29 10:37:16.838 11748-11748/com.software.example D/ViewRootImpl@89b4657[Toast]: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1
  10-29 10:37:16.878 11748-11748/com.software.example D/ViewRootImpl@3e9255b[JobCardMainActivity]: MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1
  10-29 10:37:16.878 11748-11748/com.software.example D/ViewRootImpl@3e9255b[JobCardMainActivity]: MSG_WINDOW_FOCUS_CHANGED 1
  10-29 10:37:16.879 11748-11748/com.software.example V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@5f515a4 nm : com.software.example ic=null
  10-29 10:37:16.879 11748-11748/com.software.example I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
  10-29 10:37:16.883 11748-11748/com.software.example D/InputTransport: Input channel constructed: fd=104
  10-29 10:37:16.883 11748-11748/com.software.example D/InputTransport: Input channel destroyed: fd=96
  10-29 10:37:16.902 11748-11825/com.software.example D/OpenGLRenderer: endAllActiveAnimators on 0x7cce563400 (RippleDrawable) with handle 0x7d0c2ed3a0
  10-29 10:37:16.908 11748-11748/com.software.example W/IInputConnectionWrapper: finishComposingText on inactive InputConnection
  10-29 10:37:16.909 11748-11748/com.software.example W/IInputConnectionWrapper: finishComposingText on inactive InputConnection
  10-29 10:37:17.308 11748-11748/com.software.example D/ViewRootImpl@db7b317[CreateOrEditJobCards]: dispatchDetachedFromWindow
  10-29 10:37:17.312 11748-11748/com.software.example D/InputTransport: Input channel destroyed: fd=85
  10-29 10:37:17.665 11748-11748/com.software.example D/ViewRootImpl@3e9255b[JobCardMainActivity]: ViewPostImeInputStage processPointer 0
  10-29 10:37:17.670 11748-11748/com.software.example D/ViewRootImpl@89b4657[Toast]: dispatchDetachedFromWindow
  10-29 10:37:17.675 11748-11748/com.software.example D/InputTransport: Input channel destroyed: fd=87
  10-29 10:37:17.742 11748-11748/com.software.example D/ViewRootImpl@3e9255b[JobCardMainActivity]: ViewPostImeInputStage processPointer 1
  10-29 10:37:17.847 11748-11748/com.software.example D/ViewRootImpl@3e9255b[JobCardMainActivity]: MSG_WINDOW_FOCUS_CHANGED 0
  10-29 10:37:17.909 11748-11748/com.software.example D/InputTransport: Input channel constructed: fd=87
  10-29 10:37:17.909 11748-11748/com.software.example D/ViewRootImpl@ceedbd2[CreateOrEditJobCards]: setView = DecorView@f19c4a3[CreateOrEditJobCards] touchMode=true
  10-29 10:37:17.939 11748-11825/com.software.example D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2560]-format:1
  10-29 10:37:17.941 11748-11748/com.software.example D/ScrollView:  onsize change changed 
  10-29 10:37:17.967 11748-11748/com.software.example D/ViewRootImpl@ceedbd2[CreateOrEditJobCards]: MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1
  10-29 10:37:17.967 11748-11748/com.software.example D/ViewRootImpl@ceedbd2[CreateOrEditJobCards]: MSG_WINDOW_FOCUS_CHANGED 1
  10-29 10:37:17.968 11748-11748/com.software.example V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@7f1dc85 nm : com.software.example ic=null
  10-29 10:37:17.968 11748-11748/com.software.example I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
  10-29 10:37:17.973 11748-11748/com.software.example D/InputTransport: Input channel constructed: fd=93
  10-29 10:37:17.973 11748-11748/com.software.example D/InputTransport: Input channel destroyed: fd=104
  10-29 10:37:18.000 11748-11825/com.software.example D/OpenGLRenderer: endAllActiveAnimators on 0x7cea5c2c00 (ListView) with handle 0x7d0c26c780
  </code></pre>