如何在数据库中保存复选框状态?

时间:2017-10-29 08:17:44

标签: java android checkbox

我正在尝试在我的数据库中保存一个复选框状态并稍后检索它,但它似乎不起作用。我现在得到了日志中的错误,希望有人能够提供帮助。

以下是我的复选框的代码:

 <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" />

    <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" />

然后在我的CreateOrEditJobCards.java中:

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

在我的DBHelper.java

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

基本上在这个应用程序中,用户会选择“添加新的作业卡”,然后填写表格并点击保存。然后按数字顺序显示在列表视图中。 当用户随后选择之前创建的表单时,他们可以点击发送,然后它会通过电子邮件发送表单(我仍在处理,代码不在上面)

然而就像我之前说过的那样,表单中的其他内容都可以正常运行并保存,但似乎无法获取复选框以保存已检查的状态

有人可以看看mu代码并指出我出错的地方并提供协助吗?

由于

修改

日志输出:

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

3 个答案:

答案 0 :(得分:1)

不要在插入/更新方法中传递checkA.getText()。toString(),您永远不会更改它们。只需在dbHelper.insertPerson方法中传递SaveStrings(在onCheckedChangedListeners中更改):

dbHelper.insertPerson(nameEditText.getText().toString(),
            genderEditText.getText().toString(),
            SaveString,
            SaveStringA,
            Integer.parseInt(ageEditText.getText().toString())))

考虑改变逻辑以便能够删除大量代码。

dbHelper.insertPerson(nameEditText.getText().toString(),
            genderEditText.getText().toString(),
            checkA.isChecked() ? "Yes" : "No",
            checkB.isChecked() ? "Yes" : "No",
            Integer.parseInt(ageEditText.getText().toString())))

然后,你可以摆脱onCheckedChangedListener方法,以及SaveString和SaveStringA引用。

我看到的其他一个错误.....

你有checkA.setChecked(Boolean.parseBoolean(String.valueOf(SaveString))); ..我认为parseBoolean不能正常用于“是”“否”......需要“True”“False”,所以它永远不会检索正确的检查状态,直到你改变这一点。所以要么将insertPerson方法更改为:

checkA.isChecked() ? "True" : "False"
checkB.isChecked() ? "True" : "False"

或者,将setChecked改为:

checkA.setChecked(SaveString.equals("Yes"));

答案 1 :(得分:0)

当您持久保存Person对象时,您将保存checkbox.getText()返回的内容,而不是存储复选框状态的SaveString对象。

答案 2 :(得分:0)

我将字符串用作yes和no用于复选框状态,然后保存数据库。 此外,我在按下时检测到后退按钮,并在app即将关闭时保存复选框的状态,以避免数据库中的连续垃圾邮件。 我附上我的完整代码。希望这能解决你的问题。 我也使用不同的java文件来避免混淆。

TaskContract.java

public class TaskContract {
    public static final String DB_NAME = "com.pkr.checkbox";
    public static final int DB_VERSION = 1;
    public class TaskEntry implements BaseColumns {
        public static final String TABLE = "checkbox";
        public static final String HI_CHECK = "hi_checkbox";
        public static final String HELLO_CHECK = "hello_checkbox";
    }
}

TaskDBHelper.java

public class TaskDBHelper extends SQLiteOpenHelper {
    public TaskDBHelper(Context context){
        super(context, TaskContract.DB_NAME, null, TaskContract.DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TaskContract.TaskEntry.TABLE + " ( " +
            TaskContract.TaskEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            TaskContract.TaskEntry.HI_CHECK + " TEXT NOT NULL, " +
            TaskContract.TaskEntry.HELLO_CHECK + " TEXT NOT NULL);";
        String defaultEntry = "INSERT INTO " + TaskContract.TaskEntry.TABLE + " (" + TaskContract.TaskEntry.HI_CHECK + "," + TaskContract.TaskEntry.HELLO_CHECK + ") VALUES\n" +
            "('No','No');";

        db.execSQL(createTable);
        db.execSQL(defaultEntry);
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TaskContract.TaskEntry.TABLE);
        onCreate(db);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private CheckBox hi_checkbox_but;
    private CheckBox hello_checkbox_but;
    private TaskDBHelper mHelper = new TaskDBHelper(this);
    String hi, hello;

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        hi_checkbox_but = (CheckBox) findViewById(R.id.checkBox);
        hello_checkbox_but = (CheckBox) findViewById(R.id.checkBox1);

        SQLiteDatabase db = mHelper.getReadableDatabase();
        Cursor cur = db.query(TaskContract.TaskEntry.TABLE,
            new String[]{TaskContract.TaskEntry._ID, TaskContract.TaskEntry.HI_CHECK, TaskContract.TaskEntry.HELLO_CHECK},
            null, null, null, null, null);
        while (cur.moveToNext()){
            int hi_index = cur.getColumnIndex(TaskContract.TaskEntry.HI_CHECK);
            int hello_index = cur.getColumnIndex(TaskContract.TaskEntry.HELLO_CHECK);
            hi = cur.getString(hi_index);
            hello = cur.getString(hello_index);

        }

        if (hi.equals("Yes"))
            hi_checkbox_but.setChecked(true);
        else
            hi_checkbox_but.setChecked(false);

        if (hello.equals("Yes"))
            hello_checkbox_but.setChecked(true);
        else
            hello_checkbox_but.setChecked(false);

    }

    private Boolean exit = false;

    @Override
    public void onBackPressed() {
        String hi_toPass, hello_toPass;
        if (exit) {

            if (hi_checkbox_but.isChecked())
                hi_toPass = "Yes";
            else
                hi_toPass = "No";
            if (hello_checkbox_but.isChecked())
                hello_toPass = "Yes";
            else
                hello_toPass = "No";

            SQLiteDatabase db = mHelper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(TaskContract.TaskEntry.HI_CHECK,hi_toPass);
            cv.put(TaskContract.TaskEntry.HELLO_CHECK, hello_toPass);
            db.insertWithOnConflict(TaskContract.TaskEntry.TABLE,
                null,
                cv,
                SQLiteDatabase.CONFLICT_REPLACE);
            db.close();
            finish();
        }
        else{
            Toast.makeText(this, "Press back again to exit.", Toast.LENGTH_SHORT).show();
            exit = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    exit = false;
                }
            }, 3 * 1000);
        }
    }
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
android:orientation="vertical"
tools:context="com.pkr.checkbox.MainActivity">

<CheckBox
    android:id="@+id/checkBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:text="HI" />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:text="Hello" />

</LinearLayout>
相关问题