gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:04:29 28 4
gpt4 key购买 nike

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

这是我的复选框代码:

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

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

但是,正如我之前所说,表单中的其他所有内容都可以工作并保存,但似乎无法获取复选框来保存选中的状态

有人可以看一下 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

最佳答案

不要在插入/更新方法中传递 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 不能正确地满足"is"“否”的需要... “True”“False”,因此在您更改此设置之前,它永远不会检索正确的检查状态。因此,要么将 insertPerson 方法更改为:

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

或者,将 setChecked 更改为:

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

关于java - 如何在数据库中保存复选框状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998160/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com